2015-08-21 5 views
1

В настоящее время я просто пытаюсь реализовать простой алгоритм линейной регрессии в матричной форме на основе cuBLAS с CUDA. Матричное умножение и транспозиция хорошо работают с функцией cublasSgemm.Преобразование матрицы CUDA путем ссылки на CUDA-указатель

Проблемы начинаются с матричных инверсий на основе cublas<t>getrfBatched() и cublas<t>getriBatched() функций (см. here).

Как можно видеть, входные параметры этих функций - массивы указателей на матрицы. Представьте себе, что я уже выделенную память для матрицы (A^T * A) на GPU в результате предыдущих расчетов:

float* dProdATA; 
cudaStat = cudaMalloc((void **)&dProdATA, n*n*sizeof(*dProdATA)); 

Можно ли запустить разложение (инверсия)

cublasSgetrfBatched(handle, n, &dProdATA, lda, P, INFO, mybatch); 

без дополнительного HOST < -> копирование памяти GPU (см. working example of inverting array of matrices) и выделение массивов с помощью одного элемента, но просто получите GPU-ссылку на графический указатель?

ответ

1

Не существует способа избежать того, что массив, который вы передаете, находится в адресном пространстве устройства, и то, что вы разместили в своем вопросе, не будет работать. У вас действительно есть только две возможности:

  1. Выделите массив указателей на устройстве и выполните передачу данных (решение, которое вы не хотите использовать).
  2. Использование нулевой копии или управляемой памяти хоста для хранения пакетный массиву

В последнем случае с управляемой памяти, что-то, как это должно работать (полностью тестировалась, используйте на свой страх и риск):

float ** batch; 
cudaMallocManaged((&batch, sizeof(float *)); 
*batch = dProdATA; 
cublasSgetrfBatched(handle, n, batch, lda, P, INFO, mybatch); 
+0

Спасибо! Но я боюсь, что использование управляемой памяти может быть причиной снижения скорости вычисления. –