繁体   English   中英

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

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

我有一个包装器类CudaMatrix ,它实现了多个cuBLAS操作,使我可以调用m1.multiply(m2) ,该sgemm m1.multiply(m2)在内部数据指针上运行sgemm操作。

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

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))

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

cuBLAS库使用列主存储

表示原始矩阵, mnk表示子矩阵。

注意,在fortran for C索引方案中,索引编制可能有所不同。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM