Инверсия матрицы 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 HOST ‹-> (см. рабочий пример инвертирование массива матриц) и размещение массивов с одним элементом, но просто получить ссылку GPU на указатель GPU?


person Jimmy_st    schedule 21.08.2015    source источник


Ответы (1)


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

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

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

float ** batch;
cudaMallocManaged((&batch, sizeof(float *));
*batch = dProdATA;
cublasSgetrfBatched(handle, n, batch, lda, P, INFO, mybatch);
person Community    schedule 22.08.2015
comment
Спасибо! Но боюсь, что использование управляемой памяти может стать причиной снижения скорости вычислений .. - person Jimmy_st; 24.08.2015