如何在 CUDA 中实现子矩阵的接口?

How to implement an interface to a sub-matrix in CUDA?

我有一个实现多个 cuBLAS 操作的包装器 class CudaMatrix,允许我调用 m1.multiply(m2) 对内部数据指针运行 sgemm 操作。

我想通过对子矩阵的操作来扩展 class,比如

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操作之前。

如何实现有效的子矩阵接口以避免显式复制数据?有没有我可以寻找的开源实现?

可以使用 API 调用的 ldx 参数执行子矩阵乘法。

索引在 1.1 DataLayout 部分描述:

#define IDX2C(i,j,ld) (((j)*(ld))+(i))

然后使用 cublasSgemm 例如,lda 参数等于行数

the cuBLAS library uses column-major storage

的原始矩阵,mnk 的子矩阵。

对于 C 索引方案,fortran 中的注释索引可能有所不同。

因此,您真正需要的是子矩阵的大小(列、行)和输入矩阵中列的大小(行数)。