Инверсия матрицы CUDA путем обращения к CUDA-указателю

В настоящее время я просто пытаюсь реализовать простой алгоритм линейной регрессии в матричной форме на основе 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?

1

Решение

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

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

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

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

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector