В настоящее время я просто пытаюсь реализовать простой алгоритм линейной регрессии в матричной форме на основе cuBLAS с CUDA. Матричное умножение и транспонирование хорошо работает с cublasSgemm
функция.
Проблемы начинаются с матричных инверсий, основанных на cublas<t>getrfBatched()
а также cublas<t>getriBatched()
функции (см. Вот).
Как видно, входные параметры этих функций — массивы указателей на матрицы. Представьте, что я уже выделил память для (A ^ T * A) матрицы на GPU в результате предыдущих вычислений:
float* dProdATA;
cudaStat = cudaMalloc((void **)&dProdATA, n*n*sizeof(*dProdATA));
Можно ли запустить факторизацию (инверсию)
cublasSgetrfBatched(handle, n, &dProdATA, lda, P, INFO, mybatch);
без дополнительного ХОСТА <-> Копирование памяти GPU (см. рабочий пример инвертирования массива матриц) и выделение массивов с одним элементом, но просто получить ссылку на GPU на указатель GPU?
Нет никакого способа обойти требование, что передаваемый массив находится в адресном пространстве устройства, и то, что вы разместили в своем вопросе, не будет работать. У вас действительно есть только две возможности:
В последнем случае с управляемой памятью что-то вроде этого должно работать (полностью не проверено, используйте на свой страх и риск):
float ** batch;
cudaMallocManaged((&batch, sizeof(float *));
*batch = dProdATA;
cublasSgetrfBatched(handle, n, batch, lda, P, INFO, mybatch);