2016-04-29 8 views
0

У меня есть класс-обертка CudaMatrix, который реализует несколько операций cuBLAS, позволяя мне позвонить m1.multiply(m2), который запускает операцию sgemm на внутренних указателях данных.Как реализовать интерфейс для подматрицы в CUDA?

Я хотел бы расширить класс по операциям на подматрице, что-то вроде

CudaMatrix a(100,100); 
CudaMatrix b(100,100); 
// fill a and b 

int i=5, j=15; 
CudaSubMatrix sa(a, i, j, i+10, j+10); // sa := a[5:15, 15:25] 

i=50, j=60; 
CudaSubMatrix sb(b, i, j, i+10, j+10); // sb := b[50:60, 60:70]  

CudaMatrix res; 
res.copy(sa); 
res.multiply(sb) // res = sa*sb 

В последнем ряде, multiply() должен работать на подматрице sb, поэтому строки не являются смежными и Я не могу назвать те же операции sgemm, что и раньше.

Как реализовать эффективный интерфейс для подматриц, который позволяет избежать копирования данных явно? Есть ли какие-либо версии с открытым исходным кодом, которые я могу найти?

+1

Непонятный вопрос. CUBLAS уже имеет все необходимое для выполнения операций над подматрицами без необходимости дополнительного кода интерфейса или обертки – talonmies

ответ

1

Умножение подматриц может выполняться с использованием параметра ldx вызовов API.

Индексирование описано в разделе 1.1 DataLayout:

#define IDX2C (I, J, LD) (((J) * (LD)) + (I))

Тогда использовать cublasSgemm, например, с lda параметром, равным количеству линий

библиотека cuBLAS использует столбцам хранения

оригинальной матрицы и m, n, k для подматриц.

Указание индексации может отличаться для fortran для схемы индексации C.

Следовательно, вам действительно нужен размер вашей подматрицы (col, rows) и размер столбца во входной матрице (ее количество строк).