我想设计一个内核以同时添加一个矩阵行对,但是我不知道如何实现。
例如,我有一个数据矩阵,大小为(512,1024),并且我想同时添加其行对(row1 + row2,row3 + row4,...,row511 + row512)。
我考虑这样做的原因只是为了节省时间。
能给我一些建议吗? 谢谢!
答案 0 :(得分:1)
类似的事情可能有用:
const int width = 1024;
const int rows = 512;
template <typename T>
__global__ void row_add(const T * __restrict__ din, T * __restrict__ dout){
int idx = width*2*blockIdx.x + threadIdx.x;
if (dout == din)
dout[idx] += dout[idx+width];
else
dout[idx-blockIdx.x*width] = din[idx]+din[idx+width];
}
这取决于宽度尺寸为1024或更小。您将像这样启动它:
row_add<<<rows/2, width>>>(d_in, d_out);
如果将d_in
和d_out
的不同指针传递给它,它将假定您希望将输出连续写入一个单独的数组。如果为d_in
和d_out
传递相同的指针,它将假定您要将行0 + 1的结果写入行0,将行2 + 3的结果写入行2,并且等等。
行维度必须为偶数,显然是从您的问题陈述中得出的(成对添加行)。
在浏览器中编码,未经测试,可能包含错误