gpt4 book ai didi

c++ - 如何在 CUDA 中实现子矩阵的接口(interface)?

转载 作者:行者123 更新时间:2023-11-28 05:41:49 26 4
gpt4 key购买 nike

我有一个包装类 CudaMatrix,它实现了几个 cuBLAS 操作,允许我调用运行 sgemmm1.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

原始矩阵,mnk为子矩阵。

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

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

关于c++ - 如何在 CUDA 中实现子矩阵的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36935869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com