2016-04-29 71 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

可以使用API​​調用的ldx參數執行子矩陣乘法。

索引在1.1 DataLayout部分中描述:

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

然後使用cublasSgemm例如用lda參數等於行數

的CUBLAS庫使用列爲主存儲

的原矩陣,以及m,n,k的子矩陣。

對於C索引方案,Fortran中的註釋索引可能會有所不同。

因此,您真正需要的是您的子矩陣(col,rows)的大小,以及輸入矩陣中列的大小(其行數)。