Pregunta Speedup GPU vs CPU para operaciones matriciales


Me pregunto cuánta computación GPU me ayudaría a acelerar mis simulaciones.

La parte crítica de mi código es la multiplicación de matrices. Básicamente, el código se parece al siguiente código de Python con matrices de orden 1000 y largas para bucles.

import numpy as np
m_size = 1000
sim_length = 50

a = np.random.rand(m_size, m_size)
b = np.random.rand(m_size, m_size)

for j in range(sim_length):
    result = np.dot(a,b)

Nota: Mis matrices son densas, en su mayoría aleatorias y para los bucles se compilan con cython.

Mi suposición ingenua sería que tengo dos factores:

  • Más hilos paralelos (actualmente de orden 1 hilo, GPU de orden 100 hilos?) -> Aceleración de orden 100? [Fuente está bastante desactualizado, desde 2011]
  • Menor frecuencia de procesador (actualmente 3Ghz, GPU generalmente 2 Ghz) -> Descuido

Espero que este punto de vista sea ingenuo, entonces ¿qué me estoy perdiendo?


5
2017-08-01 16:31


origen


Respuestas:


Rendimiento de multiplicación de matrices

Si utiliza numpyProbablemente esté utilizando una de las bibliotecas BLAS como backend de cómputo, como ATLAS, OpenBLAS, MKL, etc. Cuando está usando el MKL más rápido, puede encontrar una prueba de rendimiento reciente aquí, entre una GPU K40m reciente de Nvidia e Intel Xeon 12-core E5-2697 v2 @ 2.70GHz

https://developer.nvidia.com/cublas

donde K40m es 6 veces más rápido que 12 hilos E5-2697. Teniendo en cuenta que MKL escala bien en CPU multi-core. K40m es ~ 72x más rápido que el E5-2697 de 1 hilo. Tenga en cuenta que 1000-dim es casi el límite inferior para utilizar completamente tanto la GPU como la CPU. Un tamaño de matriz más pequeño generalmente conduce a una mayor degradación del rendimiento en la GPU.

Si está utilizando un backend BLAS más lento numpy, digamos el ATLAS con licencia GNU. A continuación, puede encontrar la comparación entre MKL y ATLAS aquí

https://software.intel.com/en-us/intel-mkl/benchmarks#DGEMM-ATLAS

donde MKL es 2 ~ 4 veces más rápido que ATLAS.

Para las GPU de Nvidia, el único backend ampliamente utilizado es cuBLAS de CUDA, por lo que el rendimiento no cambiará mucho como ATLAS vs. MKL.

Transferencia de datos

Como dice @janbrohl, la transferencia de datos entre la memoria RAM del host y la memoria del dispositivo GPU es un factor importante que afecta el rendimiento general. Aquí hay un punto de referencia de la velocidad de transferencia de datos.

CUDA: ¿cuánto más lento se transfiere a través de PCI-E?

Dado el tamaño de la matriz, puede calcular el tiempo absoluto para el cálculo y la transferencia de datos, respectivamente. Esto podría ayudarlo a evaluar mejor el desempeño.

Para maximizar el rendimiento en la GPU, es probable que necesite un nuevo diseño que programe para minimizar la transferencia de datos, moviendo todas las operaciones computacionales a la GPU, en lugar de la multiplicación de matrices solamente.


8
2017-08-01 17:02



En términos generales, las GPU son mucho más rápidas que las CPU en tareas simples altamente paralelas (para eso están hechas), como multiplicar matrices grandes, pero hay algunos problemas con el cálculo de GPU:

  • la transferencia de datos entre la RAM normal y la RAM de gráficos lleva tiempo
  • cargar / iniciar programas GPU toma algo de tiempo

así, mientras que la multiplicación en sí misma puede ser 100 (o más) veces más rápida, es posible que experimente una aceleración mucho más pequeña o incluso una ralentización

Hay más problemas con las GPU que son "estúpidas" en comparación con las CPU, como la desaceleración masiva en el código de bifurcación, el hecho de tener que manejar el almacenamiento en caché a mano y otros que pueden hacer que la escritura de programas rápidos para las GPU sea un desafío.


6
2017-08-01 16:41



Usando opencl api, probé 8k X 8k por 8k X 8k en una HD7870 de 1280 núcleos (ni siquiera en un gpu de escritorio de uso general) y tomó alrededor de 0,99 segundos, lo que significa aproximadamente 540 mil millones de adiciones y 540 mil millones de multiplicaciones, lo que también significa 1.1 Tflops (% 40 de su valor máximo mencionado en sus anuncios). Las CPU de alto nivel para computadoras de escritorio tienen solo 0.2 - 0.3 Tflops (valor máximo) excluyendo su gpus integrado. Por lo tanto, la mejor CPU no puede alcanzar un GPU bajo a medio tanto en el rendimiento como en el rendimiento por vatio y el rendimiento por dólar.

Opciones clave para el rendimiento:

  • cálculos en parches como 32x32 o 48x48 (para cada unidad de cómputo que tiene un grupo de subprocesos, por lo que cada subproceso calcula una parte del parche o la suma de todos los parches de una columna / fila)
  • haciendo formas exponencialmente más rápidas, como el algoritmo de Strassen.
  • canalizar las operaciones de lectura, escritura y cómputo para que las iteraciones consecutivas se acumulen provechosamente.
  • optimizando para las diferencias de hardware

  • usando una biblioteca que tiene opciones del 1 al 4


3
2017-08-22 18:26