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

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

本文关键字:接口 实现 CUDA      更新时间:2023-10-16

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

我想通过对子矩阵的运算来扩展类,比如

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部分进行了描述:

#定义IDX2C(i,j,ld)(((j)*(ld))+(i))

然后使用立方体Sgemm,例如lda参数等于的行数

cuBLAS库使用列主存储器

原始矩阵的mnk

注释索引在fortran for C索引方案中可能有所不同。

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