2019/05/19

Forzando Brutalmente MD5 - parte 5 - GPGPU


¿Venís de leer la intro, la parte 1, la parte 2, la parte 3 y la parte 4?



El tema


Finalmente, dentro del terreno de usar computadoras para calcular MD5, llegamos si no a lo último en términos tecnológicos a lo más potente.

El origen de esta técnica está en los gráficos. Siempre los gráficos han sido muy demandantes. Desde hace décadas se ha dedicado hardware especializado para convertir una zona de memoria en caracteres o imágenes en una pantalla. A medida que fué creciendo la demanda se detectó que habían ciertas operaciones muy frecuentes de alto consumo que comenzó a tener sentido darle a ese hardware la capacidad de hacerlo y quitarle esa tarea a la CPU.

Esta evolución no es exclusiva de los gráficos, de hecho en las primeras computadoras hogareñas de 8 bits, se usaban chips especializados para sonido y ya desde la primera IBM PC el teclado ha tenido su propia CPU, diminuta y ultra especializada pero CPU.

Paulatinamente estas placas han provisto aceleración para gráficos 2D y 3D, haciéndose más potentes que las CPUs que las usaban. Entonces a alguien se le ocurrió que tal si usamos esas placas para cálculos en lugar de para gráficos?

La situación actual es que existen la GPGPU, General-Purpose computing on Graphics Processing Unit y una interfaz programática que no es un hack como pudo serlo la comienzo.

En la misma linea de la supercomputadora, se usan CPUs sencillas, casi ni califican, optimizadas para cálculo. Y son muchas, centenares o miles.

Como dato de color, estuve intentando conseguir una PS3, anterior a cierto modelo para poder ejecutar linux pero no pude. El interés estaba dado por que esa consola tiene un antecesor de GPGPU, llamado Cell Processor en el cual se pueden ejecutar programas arbitrarios.

Contacté a uno de los que habían desarrollado las librerías y me dijo:

 

I have left IBM quite a few years ago and I can offer no reliable reference on IBM products; however the Cell Processor is long past its end of life.
 
My personal suggestion to you is that your time is vastly better spent learning how to optimize code for NVidia GPUs, rather than for the Cell Processor.
 

 

Cuando le expliqué mejor mi propósito:

Oh, I see, you are doing computer archaeology. Yes, that makes sense. You should be able to find the Cell SDK v3.0 mirrored on the Internet. You'll have some troubles running it on a modern linux, but with some patience you'll be alright.

 

Pero no pude conseguir el hardware y se me fueron las ganas.


Para portar lo que tenía usé CUDA, es parecido a supercomputadora pero se puede meter todo en un mismo programa, es un poco más difícil de explicar mostrando código pero la esencia es que preparás la tabla de rangos a explorar, la copias a la memoria de la placa, llamás a la función que se va a desplegar en los centenares de cores, la función toma el rango sobre el que va a explorar y luego copiás los resultados de la placa a la memoria principal.



cpucpu unrollavx2 + unrollthreads x 4
+ avx2
threads x 32gpu x 64gpu x 4096
velocidad5.79.647.9153.417933.551090.1
rendimiento watt0.861.444.267.194.8823.013.1
rendimiento dolar2.38411.8319.9613.5463.9213.16

 

Acá el rendimiento es aún más difícil de interpretar pues para que funcione la GPU hace falta la CPU, el valor calculado es aislado. Se pueden usar múltiples GPU distribuyendo el costo y consumo de la CPU entre estas.

 



cpucpu unrollavx2
+ unroll
threads
x 4
+ avx2
threads
x 32
gpu
x 64
gpu
x 4096


5.709.6047.90153.40179.0033.551090.1
cpu5.701.001.688.4026.9131.405.89191.25
cpu unroll9.60
1.004.9915.9818.653.49113.55
avx2 + unroll47.90

1.003.203.740.7022.76
threads x 4
+ avx2
153.40


1.001.170.227.11
threads x 32179.00



1.000.196.09
gpu x 6433.55




1.0032.49
gpu x 40961090.1





1.00




Código

  • https://github.com/cpantel/Forzando-Brutalmente-MD5/tree/master/v7_cuda

Seguí con la parte 6 y con la implementación FPGA en nexys4ddr

 

 

 

 

 

 

No hay comentarios:

Publicar un comentario