Buscadores, Mineros y 49: Minería GPU-CPU Dual en el ODROID-XU4/MC1/HC1/HC2

Hay muchas personas que usan XU4/MC1/HC1/HC2 para la minería de criptomonedas por CPU, entonces, ¿Podría llegar a ser mejor que usar tu GPU para la mineria? El rendimiento del algoritmo no es viable para muchas de las monedas más populares, pero en el contexto adecuado podría tener sentido, como son las monedas nuevas o monedas con poca dificultad. Aunque no sirva para otra cosa, básicamente es otra herramienta divertida para tu colección de herramientas.

Después de analizar las opciones disponibles, empecé a trabajar en la compilación del fork de SGMiner de Genesis Mining. SGMiner-GM 5.5.5 es un cripto minador de GPU OpenCL y es la versión más reciente de SGMiner. Ha sido por un tiempo, compatible con más algoritmos de criptografía que las versiones anteriores, y no tiene una tarifa de uso. Incluye minería para Credits, Scrypt, NScrypt, X11, X13, X15, X15, Keccak, Quarkcoin, Twecoin, Fugue256, NIST, Fresh, Whirlcoin, Neoscrypt, WhirlpoolX, Lyra2RE, Lyra2REV2, Pluck, Yescrypt, Yescrypt-multi, Blakecoin, Blake, Vanilla, Ethash, Cryptonight y Equihash.

La código fuente del programa está disponible para su descarga en https://goo.gl/Gp25ep, y al hilo de soporte del foro se puede acceder desde https://goo.gl/hDVmbF.

Figure 1 - XU4 Dual pool mining Monacoin with CPUMiner-Multi and SGMiner-GM 5.5.5 using Lyra2REv2
Figura 1 – Sistema dual XU4 minando Monacoin con CPUMiner-Multi y SGMiner-GM 5.5.5 utilizando Lyra2REv2

Es posible, junto con CPUMiner-Multi o un minero específico de monedas como VeriumMiner, minar CPU y GPU al mismo tiempo. No se han realizado pruebas exhaustivas, pero se han completado con éxito varias configuraciones de minería dual, incluidas scrypt2, Lyra2REv2 y cryptonight (solo CPU), individual y minería en grupo. Es posible montar una mina individual en una y un conjunto de minas en otro mientras se ejecutan otros algoritmos de cifrado. Las temperaturas de la CPU durante la minería dual requieren grandes núcleos de CPU para moderar la velocidad, así que, por favor, presta atención a las temperaturas si decides probar esto.

CPUMiner-Multi soporta más de 45 algoritmos de cifrado, lo que lo hace bastante útil para la minería de múltiples algoritmos. Si aún no está familiarizado con él, échale un vistazo en  https://goo.gl/hUQG3F. Otro programa muy útil de minería dual para aquellos que extraen Verium (VRM) es un fork de VeriumMiner por fireworm71 en https://goo.gl/6ET7bj.

El sistema de minería puede ejecutarse en 1 y 3 vías al mismo tiempo, lo que permite una mejor utilización de la memoria. Parece que si la GPU (SGMiner) se inicia primero, terminarás con más memoria para poder utilizar el algoritmo de criptografía por CPU mientras se realiza la minería dual. A continuación, se muestra la línea de comandos utilizada para la minería Verium (4 núcleos grandes de 3 vías y 1 núcleo pequeño de 1 vía), al mismo tiempo que la GPU extrae Monacoin con Lyra2REv2:

$ ~/cpuminer -o stratum+tcp://yourpool.na:port -u username -p password --randomize --no-redirect -t 4 -1 1 --cpu-affinity-stride 1 --cpu-affinity-default-index 4 --cpu-affinity-oneway-index 0

Compilar SGMiner-GM 5.5.5

Las siguientes instrucciones son las típicas para SGMiner, con la excepción de las modificaciones del archivo fuente. Tienes información general y de configuración en la wiki de instalación para Ubuntu 16.04 x86 en https://goo.gl/qnFmb2. Primero, descarga la última liberira ARM Computer Vision and Machine Learning desde https://goo.gl/LdFvy5.

Ten en cuenta que el paquete sin comprimir no cabe en una tarjeta SD de 8GB. Puedes eliminar las librerías innecesarias de ./arm_compute-v17.12-bin/lib para reducir su tamaño. Mantén las librerías linux-armv7a y elimina los archivos android- * y linux-arm8 *. La instalación por defecto esta en /usr/lib/arm_compute-v17.12-bin

$ cd /usr/lib
$ tar -xvzf ~/arm_compute-v17.12-bin.tar.gz
$ cd ~/
$ rm arm_compute-v17.12-bin.tar.gz
Descarga el SDK APP AMD desde https://goo.gl/cZeDJc. Esto es para una instalación root desde ~ /. Consulta las notas de instalación para una instalación no root en https://goo.gl/Hw7vkP. La instalación por defecto esta en /opt/AMDAPPSDK-3.0.
$ tar -xvjf AMD-APP-SDKInstaller-v3.0.130.136-GA-linux32.tar.bz2
$ ./AMD-APP-SDK-v3.0.130.136-GA-linux32.sh
$ rm AMD-APP-SDK-v3.0.130.136-GA-linux32.sh
$ rm AMD-APP-SDKInstaller-v3.0.130.136-GA-linux32.tar.bz2
Descarga el AMD Display Library (ADL) SDK desde https://goo.gl/CqhZq1:
$ apt-get install unzip
$ unzip ADL_SDK_V10.2.zip -d /opt/ADL_SDK_V10.2
$ rm ADL_SDK_V10.2.zip
Instala las dependencias con el siguiente comando:
$ apt-get install automake autoconf pkg-config
$ libcurl4-openssl-dev libjansson-dev libssl-dev libgmp-dev make $ g++ git libgmp-dev libncurses5-dev libtool mali-fbdev
Ten en cuenta que mali-fbdev es necesario si se utiliza una imagen minimalista de Ubuntu; de lo contrario, utiliza Mali-T628-ODROID para la imagen minimalista de Debian.

Descarga Git y mueve las cabeceras con los siguientes comandos:

$ git clone https://github.com/genesismining/sgminer-gm
$ cd sgminer-gm
$ cp /opt/ADL_SDK_V10.2/include/*.h ./ADL_SDK
Algunas de las versiones de SGMiner que he visto tienen problemas de compilación similares; otras tienen problemas adicionales. Esto es lo que se debe cambiar en el código fuente de SGMiner-5.5.5 para que se compile correctamente. Realiza las siguientes modificaciones en 4 archivos:

Cambiar la línea 32 de kernel/lyra2rev2.cl de:

#pragma OPENCL EXTENSION cl_amd_printf : enable
a:
#pragma OPENCL EXTENSION cl_amd_printf : disable
Cambiar kernel/skein256.cl empezando por la línea 49-59 de:
__constant static const int ROT256[8][4] =
 {
 46, 36, 19, 37,
 33, 27, 14, 42,
 17, 49, 36, 39,
 44, 9, 54, 56,
 39, 30, 34, 24,
 13, 50, 10, 17,
 25, 29, 39, 43,
 8, 35, 56, 22,
 };
a:
__constant static const int ROT256[8][4] =
 {
 {46, 36, 19, 37},
 {33, 27, 14, 42},
 {17, 49, 36, 39},
 {44, 9, 54, 56},
 {39, 30, 34, 24},
 {13, 50, 10, 17},
 {25, 29, 39, 43},
 {8, 35, 56, 22}
 };
Cambiar la línea 58 de ocl/build_kernel.c de:
sprintf(data->compiler_options, "-I \"%s\" -I \"%s/kernel\" -I \".\" -D WORKSIZE=%d",
a:
sprintf(data->compiler_options, "-I %s -I %s/kernel -I . -D WORKSIZE=%d",
Cambiar la línea 66 de:
strcat(data->compiler_options, " -I \"");
a:
strcat(data->compiler_options, " -I ");
Cambiar la línea 68 de:
strcat(data->compiler_options, "\"");
a:
strcat(data->compiler_options, "/");
Cambiar algorithm/cryptonight.c empezando en la línea 139 de:
__asm__("mul %%rdx":
"=a" (lo), "=d" (hi):
"a" (a), "d" (b));
a:
//__asm__("mul %%rdx":
//"=a" (lo), "=d" (hi):
//"a" (a), "d" (b));
Cryptonight se vuelve inoperativo anulando la optimización del montaje. No usar Cryptonight, WhirlpoolX, Ethash o Equihash, ya que después de solucionar el tema del montaje extendido, se compila, pero aparece otro problema que no es fácil de corregir. Parece que estos kernels OpenCL usan extensiones AMD OpenCL que no son compatibles con la plataforma ARM y, por lo tanto, no pueden compilar y activar la GPU. Es posible que sea necesario volver a escribir los kernels para que funcionen. Hace falta investigar más afondo, ya que Cryptonight es utilizado por más monedas y puede ser económicamente viable para la minería por GPU y CPU en este dispositivo. Continuaré trabajando en ello.

Introduce los siguientes comandos en el directorio base de SGMiner-GM para finalizar la compilación:

$ git submodule init
$ git submodule update
$ autoreconf -fi
$ CFLAGS="-Os -Wall -march=native -std=gnu99 -mfpu=neon" LDFLAGS="-L/usr/lib/arm_compute-v17.12-bin/lib/linux-armv7a-neon-cl" ./configure --disable-git-version --disable-adl --disable-adl-checks --prefix=/opt/sgminer
En el resumen de la configuración, debería ver que se ha encontrado OpenCL y que el minado por GPU está activado. Si no es así, OpenCL no está configurado correctamente y debe corregirse antes de continuar. Las imágenes Ubuntu de Hardkernel vienen con la configuración de OpenCL. Esta compilación se realizó en ubuntu-16.04.3-4.14-minimal-odroid-xu4-20171213.img con éxito. Verifica tus pasos con detenimiento.
------------------------------------------------------------------------
sgminer 5.5.5-gm-a
------------------------------------------------------------------------

Configuration Options Summary:

Use git version......: no
libcurl(GBT+getwork).: Enabled: -lcurl
curses.TUI...........: FOUND: -lncurses
OpenCL...............: FOUND. GPU mining support enabled
ADL..................: Detection overrided. GPU monitoring support DISABLED

Compilation............: make (or gmake)
CPPFLAGS.............:
CFLAGS...............: -Os -Wall -march=native -std=gnu99 -I/opt/AMDAPPSDK-3.0/include
LDFLAGS..............: -L/usr/lib/arm_compute-v17.12-bin/lib/linux-armv7a-neon-cl -lpthread
LDADD................: -ldl -lcurl submodules/jansson/src/.libs/libjansson.a -lpthread -L/opt/AMDAPPSDK-3.0/lib/x86 -lOpenCL -lm -lrt

Installation...........: make install (as root if needed, with 'su' or 'sudo')
prefix...............: /opt/sgminer
Crea e instala el paquete:
$ make -j5
$ make install

Pruebas rápidas

$ ./sgminer --version

$ sgminer 5.5.5-gm-a

$ ./sgminer -n

[20:41:54] CL Platform vendor: ARM
[20:41:54] CL Platform name: ARM Platform
[20:41:54] CL Platform version: OpenCL 1.2 v1.r12p0-04rel0.03af15950392f3702b248717f4938b82
[20:41:54] Platform devices: 2
[20:41:54] 0 Mali-T628
[20:41:54] 1 Mali-T628
[20:41:54] 2 GPU devices max detected
Según la Wiki de instalación, "La primera fallará si faltan las librerías, de modo que, si obtenemos un número de versión, entonces es que el binario compilado se está ejecutando adecuadamente en nuestro sistema. La segunda comprueba si hay dispositivos GPU OpenCL en la plataforma OpenCL por defecto. Si ambos comandos funcionan sin error y este último indica la plataforma OpenCL correcta, estás en el buen camino hacia una instalación funcional".

Suponiendo que tiene cuentas configuradas para minar sólo o en conjunto, una forma rápida de configurarlo es usar la línea de comandos en lugar de un archivo de configuración. Puedes obtener más información sobre todo esto en la wiki de instalación y en ./sgminer/doc/configuration.md. Usar un simple script para realizar pruebas es rápido y fácil ya que no es necesario configurar ciertas variables.

#!/bin/bash

$ export GPU_FORCE_64BIT_PTR=0
$ export GPU_USE_SYNC_OBJECTS=1
$ export GPU_MAX_ALLOC_PERCENT=100
$ export GPU_SINGLE_ALLOC_PERCENT=100
$ export GPU_MAX_HEAP_SIZE=100
$ ./sgminer -k algorithm -o stratum+tcp://pool.na:port -u user.worker -p password -I 14 -w 64 -d 0,1 --thread-concurrency 8192
La intensidad (-I 14) y la cantidad de trabajo (-w 64) pueden ajustarse para un mejor (o peor) rendimiento. Puesto que la Mali-T628 tiene dos dispositivos, ambos son seleccionados (-d 0,1). El dispositivo 0 tiene 4 núcleos y el Dispositivo 1 tiene 2 núcleos. Tienes más información sobre la configuración de la GPU en ./sgminer/doc/gpu.md.

Cuando inicias SGMiner, hay una larga demora de unos 30 a 40 segundos mientras que se crean y cargan los kernels para ambos dispositivos GPU. En la pantalla solo aparecen un par de líneas y puede parecer que se ha colgado. Sé paciente. Luego se volverá negra durante aproximadamente 10-15 segundos, tras lo cual se mostrará la blasfemia. Para la prueba, puede usar un -T en la línea de comando para desactivar la interfaz de blasfemia del terminal y usar texto simple. Se muestra bastante información durante el proceso de iniciación. Son normales algunos errores de hardware mientras se ejecuta. Si observas que se reciben muchos errores de hardware, intenta ajustar la intensidad, ya que cada algoritmo es diferente y debe afinarse. Aquí es donde es muy útil usar un archivo de configuración. Puede usar diferentes configuraciones para diferentes algoritmos y grupos.

Mi clúster XU4/MC1 está dividido en cuatro grupos térmicos y funciona a unas velocidades que permiten mantener la actividad 24/7/365 en el rango de 70-79 ℃. Los MC1 son los que menos se calientan de todos los ODROID. La Figura 2 muestra una minería de conjunto dual Verium con scrypt (CPUMiner) y Monacoin con Lyra2REv2 (SGMiner) -- dos horas para conocer el rendimiento. Con esta combinación y frecuencia, la tasa de hash de la CPU disminuyó aproximadamente en un 19% mientras que el minado por GPU y la tasa de hash de la GPU disminuyeron aproximadamente un 4% durante el minado por CPU. Esto, por supuesto, variará dependiendo el algoritmo y otros factores de configuración. Se han realizado pruebas de 24 horas con treinta ODROIDs con doble minado sin problemas.

Figure 2 - Running SGMiner on the ODROID-XU4 cluster
Figura 2 - Ejecución de SGMiner en el clúster ODROID-XU4

Independientemente del hecho de que algunos de los kernels OpenCL no funcionen, esta sigue siendo la mejor opción que conozco para la minar por GPU en XU4/MC/HC1/HC2. La buena noticia es que hay muchos otros algoritmos de criptografía que admite SGMiner, pero solo unos pocos han sido probados. Haznos saber a todos si encuentras más que tengan algún problema. Cuando se hagan más avances para que el resto de kernels funcionen, se publicarán en el foro https://forum.odroid.com/viewtopic.php?f=98&t=29571.

Prueba de Minería Dual GPU-CPU

La Prueba de minería Dual CPU-GPU está diseñada para estudiar los efectos del cambio de frecuencia de la CPU sobre la temperatura de funcionamiento de la GPU durante 1 hora y 50 minutos con una temperatura ambiente de aproximadamente unos 76 F (24,44 C). Durante los primeros diez minutos de la prueba, solo se usó la GPU para determinar el punto de partida de la temperatura de funcionamiento utilizando el conjunto Monacoin y Lyra2REv2 (SGMiner) con las siguientes opciones:

-I 14 -w 64 -d 0,1 --thread-concurrency 8192
Durante del resto de la prueba de minería dual, se usaron Verium CPU con Scrypt (8 hilos CPUMiner sin afinidad) Monacoin GPU y Solo con Lyra2REv2 (hilo de 1 SGMiner) con las siguientes opciones:
-I 14 -w 64 -d 0,1 --thread-concurrency 8192
La frecuencia de la CPU se redujo en 100 Mhz cada diez minutos hasta 1,2 Ghz y luego aumenta 100 Mhz cada cinco minutos hasta 1.9 Ghz. Luego cambio a 1.6 Ghz para el resto de la prueba.

La GPU minó a 51 ℃ durante los primeros diez minutos de la prueba, y luego aumentó con la temperatura de los núcleos de la CPU estancándose en cada cambio de frecuencia. La GPU nunca superó los 72 ℃, excepto por unos breves picos de 74 ℃. La temperatura baja en la GPU durante la prueba, parece estar correlacionada con el cambio de frecuencia de los núcleos de la CPU. La velocidad de hash de la GPU (71 kh / s) se mantuvo estable durante toda la prueba, mientras que la tasa de hash de la CPU varió en función de la configuración de la frecuencia, como era de esperar.

Figure 3 - Dual Mining GPU/CPU Core Temperatures vs. Frequency
Figura 3 – Temperaturas vs Frecuencias de los núcleos GPU/CPU en Minería Dual

Una nota rápida sobre los valores rechazados para los nuevos mineros. Existen numerosas razones por las que puede recibir valores rechazados u obsoletos. Aunque podría ser un error, la mayoría de las veces están causados por la latencia de la red. Existen dos escenarios posibles, donde el primero es que tu plataforma está minando un bloque, encuentra un recurso compartido válido y lo envía a la red. Mientras tanto, el bloque se resolvió y se emitió un nuevo bloque y tarea. Cuando se envía tu acción, está obsoleta y es rechazada. El indicador ST en SGMiner indica la cantidad de acciones obsoletas que has enviado. Esto no es un error, y no hay mucho que puedas hacer al respecto. Puede reducir la posibilidad de tener problemas al no minar un conjunto en el otro lado del mundo, creando así más latencia para tu minero. Busca un servidor en tu país o tan cerca cómo te sea posible. La mayoría de las agrupaciones ofrecen múltiples servidores geográficamente dispersos por este motivo.

El segundo escenario es que tengas suerte y encuentras un bloque, pero cuando se presenta la solución, otra persona ya envió una solución válida antes que tú. Ahora tiene un bloque huérfano. Estas son dos de las causas más comunes, y a menos que obtenga muchos rechazos, no debería ser un problema. Si está recibiendo muchos rechazos y tiene muchos errores GPU, probablemente estés presionando demasiado tu GPU y necesitas ajustar la intensidad, la carga trabajo o la cantidad de subprocesos. Simplemente porque puedas minar una moneda no significa que encuentre una moneda minando solo, o una acción válida si minas en grupo. Un buen ejemplo sería probar y extraer bitcoin con algo que no sea un dispositivo ASIC (Application Integrated Integrated Circuit). La velocidad y la dificultad de hash van más allá de la capacidad del hardware, a menos que tengas mucha suerte. Si es así, ¡Para! ¡Te acaba de tocar la lotería!

La mayoría de grupos no mostrarán la tasa de hash o incluso que estás minando hasta que no envíes un valor válido. Cuando el bloque cambia y no se han enviado nuevos valores compartidos, vuelves a no aparecer en el grupo. Si está extrayendo una moneda económicamente mal emparejada para el dispositivo, no te sorprendas si tu minero no está presente en el grupo. Encuentra una moneda que quieras minar y empareja el dispositivo HW apropiado para la dificultad y la tasa hash. Alternativamente, utiliza todos los dispositivos HW que tengas disponibles, comprueba qué monedas puedes minar con tu potencial. ¡Diviértete y buena suerte con la micro-minería!

Be the first to comment

Leave a Reply