examples python cuda gpgpu inline-code pycuda

python - examples - PyCUDA: C/C++ incluye?



pycuda 2018 (1)

Algo que realmente no se menciona en ninguna parte (al menos que yo pueda ver) es qué funciones de la biblioteca están expuestas a los kernels CUDA en línea.

Específicamente estoy haciendo pequeñas / estúpidas multiplicaciones de matrices que no merecen descargarse individualmente en la GPU, pero estoy descargando una sección más grande del algoritmo que incluye esta multiplicación. A nadie le ha gustado usar sus propias funciones de linalg, ya que alguien siempre lo ha hecho mejor.

TLDR ¿Con qué bibliotecas puedo jugar mientras estoy en kernel en línea bajo PyCUDA?


No conozco ninguno, y siempre pensé que sería útil tenerlo.

Para el tamaño de los problemas con los que suelo trabajar (matrices pequeñas y tensores que surgen en el método de elementos finitos), escribí plantillas C ++ para realizar las operaciones. La configuración de las funciones permite al compilador conocer los recuentos de viajes en tiempo de compilación, y puede desenrollar bucles y mantener en registro los resultados o los resultados intermedios, lo que tiende a ser muy eficiente para el rendimiento del kernel. Entonces, el producto matriz-matriz se declara como

template < typename Real, unsigned int l, unsigned int m, unsigned int n > __device__ __host__ void matmul(const Real *a, const Real *b, Real *c) { for(int i=0; i<l; i++) { for(int j=0; j<n; j++) { Real dotprod = Real(0); for(int k=0; k<m; k++) { dotprod += a[idx2c(i,k,l)] * b[idx2c(k,j,m)]; } c[idx2c(i,j,l)] = dotprod; } } }

Para el tipo de tamaños que surgen en mis núcleos (2x2, 3x3, 4x4, 8x8, 9x9), hacer lo anterior y dejar que la compilación funcione parece ser tan bueno como cualquier otro enfoque que he probado. Debido a que en el nivel de subprocesamiento CUDA es efectivamente escalar, no hay primitivos vectoriales o cosas por el estilo que se puedan usar para acelerar este tipo de operaciones pequeñas.