performance – Comprender el rendimiento de OpenCL

Pregunta:

Estoy usando la interfaz de ViennaCL para Eigen como una forma de aprovechar OpenCL. Específicamente, estoy usando ::viennacl::linalg::bicgstab_tag con una matriz dispersa Eigen. Sin embargo, la actuación no es la que esperaba.

¿Qué herramientas en Windows 7 / Mac OS X / Linux debo utilizar para comprender los cuellos de botella en el rendimiento?

Respuesta:

Declaración general: para tamaños de sistema pequeños, el uso de OpenCL tiene pocos beneficios.

Muy bien, ahora para la justificación: hay una cierta cantidad de sobrecarga asociada con cada lanzamiento del kernel de OpenCL. Los tiempos exactos dependen del hardware subyacente, pero como regla general, se puede usar una estimación pesimista de 10 microsegundos para las CPU y 100 microsegundos para las GPU, como informé una vez en este hilo en el foro Intel OpenCL . Esto es MUCHO considerando que el hardware moderno proporciona muchos GFLOP de potencia de procesamiento. Por ejemplo, agregar dos vectores con 100.000 entradas cada uno en una GPU con un ancho de banda de memoria de 100 GB / seg requiere 3 * 8 * 100.000 Bytes (aproximadamente 2 MB) de datos para ser transferidos, lo que toma 20 us. Por lo tanto, incluso sumar dos vectores de tamaño 100.000 puede mostrar una sobrecarga significativa de lanzamiento del kernel. En la práctica, la sobrecarga de lanzamiento del kernel se puede reducir si los kernels se ponen en cola mientras otro kernel todavía está activo; esto, sin embargo, requiere nuevamente que los tiempos de ejecución del kernel sean lo suficientemente grandes.

Dado que la mayoría de las operaciones dentro de los solucionadores de Krylov son comparables en complejidad a las adiciones de vectores (esto a menudo también se aplica a las multiplicaciones dispersas de matriz-vector), los puntos de referencia para tamaños de sistema por debajo de 10.000 por 10.000 miden esencialmente solo los gastos generales de lanzamiento del kernel de OpenCL. Por lo tanto, recomiendo ejecutar puntos de referencia nuevamente con su límite superior de 50k por 50k. Para tamaños de sistema más pequeños, simplemente use BiCGStab con la matriz Eigen directamente (esta es una de las razones por las que ViennaCL ofrece implementaciones genéricas …) o pruebe los solucionadores directos dispersos.

Para los sistemas densos (matrices), la noción de "sistema pequeño" ciertamente se desplaza a valores más pequeños. Aún así, por debajo de los tamaños del sistema de aproximadamente 1000×1000, los gastos generales vuelven a ser significativos.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım