2010-04-30 8 views
6

Me pregunto acerca de la biblioteca cuBLAS de NVIDIA. ¿Alguien tiene experiencia con eso? Por ejemplo, si escribo un programa C usando BLAS ¿podré reemplazar las llamadas a BLAS con llamadas a cuBLAS? ¿O mejor aún implementar un mecanismo que el usuario elija en tiempo de ejecución?BLAS y CUBLAS

¿Qué tal si uso la biblioteca BLAS proporcionada por Boost with C++?

Respuesta

1

CUBLAS no se ajusta a BLAS. CUBLAS también accede a las matrices en una ordenación de columna principal, como algunos códigos Fortran y BLAS.

Estoy más acostumbrado a escribir código en C, incluso para CUDA. Un código escrito con CBLAS (que es una envoltura C de BLAS) se puede cambiar fácilmente en un código CUDA. Tenga en cuenta que los códigos Fortran que usan BLAS son bastante diferentes de los códigos C/C++ que usan CBLAS. Fortran y BLAS normalmente almacenan matrices o arreglos dobles en ordenamiento de columna principal, pero C/C++ normalmente maneja el orden de Fila mayor. normalmente manejar este problema escribiendo ahorro de las matrices en un arrays 1D, y el uso de #define para escribir un acceso toa macro el elemento i, j de una matriz como:

/* define macro to access Aij in the row-wise array A[M*N] */ 
#define indrow(ii,jj,N) (ii-1)*N+jj-1 /* does not depend on rows M */ 
/* define macro to access Aij in the col-wise array A[M*N] */ 
#define indcol(ii,jj,M) (jj-1)*M+ii-1 

biblioteca CBLAS tiene una bien organizar parámetros y convenciones (variables de contexto) para dar a cada función el orden de la matriz. Tenga en cuenta que también el almacenamiento de matrices varía, una matriz con bandas filantes no se almacena igual que una matriz de bandas en columnas.

No creo que haya mecanismos que permitan al usuario elegir entre usar BLAS o CUBLAS, sin escribir el código dos veces. CUBLAS también tiene en la mayoría de las llamadas de función una variable "manejar" que no aparece en BLAS. Pensé en #define para cambiar el nombre en cada llamada de función, pero podría no funcionar.

0

He estado transfiriendo el código BLAS a CUBLAS. La biblioteca BLAS que uso es ATLAS, entonces lo que digo puede ser correcto solo hasta la elección de la biblioteca BLAS.

ATLAS BLAS requiere que especifique si está utilizando el orden principal de columna o el orden principal de fila, y elegí el orden de columna principal ya que estaba usando CLAPACK que utiliza ordenamiento de columna principal. LAPACKE, por otro lado, usaría el orden principal de filas. CUBLAS es el orden principal de la columna. Es posible que deba ajustar en consecuencia.

Incluso si el pedido no es un problema, portar a CUBLAS de ninguna manera fue un reemplazo. El problema más importante es que debe mover los datos dentro y fuera del espacio de memoria de la GPU. Esa memoria se configura usando cudaMalloc() y se libera con cudaFree() que actúa como uno podría esperar. Mueve datos a la memoria de la GPU usando cudaMemcpy(). El tiempo para hacerlo será un gran factor determinante si vale la pena pasar de la CPU a la GPU.

Una vez hecho esto, las llamadas son bastante similares. CblasNoTrans se convierte en CUBLAS_OP_N y CblasTrans se convierte en CUBLAS_OP_T. Si su biblioteca BLAS (como ATLAS) le permite pasar escalares por valor, tendrá que convertir eso para pasar por referencia (como es normal para FORTRAN).

Dado esto, cualquier conmutador que permita elegir entre CPU/GPU estaría más fácilmente en un nivel más alto que dentro de la función que utiliza BLAS. En mi caso, tengo variantes de CPU y GPU del algoritmo y las elegí a un nivel más alto dependiendo del tamaño del problema.

5

La respuesta de janneb es incorrecta, cuBLAS es no un reemplazo directo para una CPU BLAS. Supone que los datos ya están en el dispositivo, y las firmas de función tienen un parámetro adicional para realizar un seguimiento de un contexto cuBLAS.

Sin embargo, al ingresar a CUDA 6.0 hay una nueva biblioteca llamada NVBLAS que proporciona exactamente esta funcionalidad de "acceso directo". Intercepta las llamadas BLAS Level3 (GEMM, TRSV, etc.) y las envía automáticamente a la GPU, embaldosando con eficacia la transferencia PCIE con un cálculo en la GPU.

Hay información aquí: https://developer.nvidia.com/cublasxt, y CUDA 6.0 está disponible para los desarrolladores registrados de CUDA hoy.

Los documentos completos estarán en línea una vez que CUDA 6.0 se haya lanzado al público en general.

Cuestiones relacionadas