programacion - Encuentra max/min en CUDA sin pasarlo a la CPU
nvidia gpu (2)
Necesito encontrar el índice del elemento máximo en una matriz de flotadores. Estoy usando la función "cublasIsamax", pero esto devuelve el índice a la CPU, y esto está ralentizando el tiempo de ejecución de la aplicación.
¿Hay alguna forma de calcular este índice de manera eficiente y almacenarlo en la GPU?
¡Gracias!
Dado que se introdujo la API CUBLAS V2 (con CUDA 4.0, IIRC), es posible tener rutinas que devuelvan un escalar o índice para almacenarlas directamente en una variable en la memoria del dispositivo, en lugar de en una variable de host (lo que implica un dispositivo para transferencia de host y puede dejar el resultado en el espacio de memoria incorrecto).
Para usar esto, debe usar la llamada cublasSetPointerMode
para indicarle al contexto CUBLAS que los punteros del dispositivo sean punteros del dispositivo utilizando el modo CUBLAS_POINTER_MODE_DEVICE
. Esto implica que en una llamada como
cublasStatus_t cublasIsamax(cublasHandle_t handle, int n,
const float *x, int incx, int *result)
ese result
debe ser un puntero del dispositivo.
Si desea utilizar CUBLAS y tiene una GPU con capacidad de cálculo 3.5 (K20, Titán), puede usar CUBLAS con paralelismo dinámico. Entonces puede llamar a CUBLAS desde un kernel en la GPU y no se devolverán datos a la CPU. Si no tiene un dispositivo con cc 3.5, probablemente tendrá que implementar una función de búsqueda máxima usted mismo o buscar una biblioteca adicional.