如何在 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
的原始矩阵,m
、n
、k
的子矩阵。
对于 C 索引方案,fortran 中的注释索引可能有所不同。
因此,您真正需要的是子矩阵的大小(列、行)和输入矩阵中列的大小(行数)。
我有一个实现多个 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
的原始矩阵,m
、n
、k
的子矩阵。
对于 C 索引方案,fortran 中的注释索引可能有所不同。
因此,您真正需要的是子矩阵的大小(列、行)和输入矩阵中列的大小(行数)。