作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包装类 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
操作如前。
如何实现一个高效的子矩阵接口(interface),避免显式复制数据?是否有任何我可以寻找的开源实现?
最佳答案
可以使用 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 中可能有所不同。
因此,您真正需要的是子矩阵的大小(列、行)和输入矩阵中列的大小(行数)。
关于c++ - 如何在 CUDA 中实现子矩阵的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36935869/
我是一名优秀的程序员,十分优秀!