2013-08-29 4 views
1

Мне нужно найти индекс максимального элемента в массиве поплавков. Я использую функцию «cublasIsamax», но это возвращает индекс в CPU, и это замедляет время работы приложения.Найти max/min в CUDA, не передавая его в CPU

Есть ли способ эффективно вычислить этот показатель и сохранить его в графическом процессоре?

Спасибо!

ответ

6

С момента введения CUBLAS V2 API (с CUDA 4.0, IIRC) возможно иметь подпрограммы, которые возвращают скаляр или индекс, чтобы хранить их непосредственно в переменной в памяти устройства, а не в переменной хоста (которая влечет за собой передачу устройства на перенос и может оставить результат в неправильном пространстве памяти).

Чтобы использовать эту функцию, вам нужно использовать cublasSetPointerMode вызов сказать контекст CUBLAS ожидать указатели для скалярных аргументов, чтобы быть устройством указателей, используя режим CUBLAS_POINTER_MODE_DEVICE. Тогда это означает, что в вызове, как

cublasStatus_t cublasIsamax(cublasHandle_t handle, int n, 
          const float *x, int incx, int *result) 

что result должен быть указателем устройства.

+0

Спасибо, это сработало очень красиво! – rodms

0

Если вы хотите использовать CUBLAS, и у вас есть GPU с возможностью вычисления 3.5 (K20, Titan), вы можете использовать CUBLAS с динамическим параллелизмом. Чем вы можете вызывать CUBLAS из ядра на графическом процессоре, и никакие данные не будут возвращены CPU. Если у вас нет устройства с cc 3.5, вам, вероятно, придется самостоятельно реализовать функцию find max или искать дополнительную библиотеку.

Смежные вопросы