我想设计一个内核来同时添加矩阵行对,但我不知道如何实现它。
例如,我有一个数据矩阵,大小为(512,1024),我想同时添加其行对(row1 + row2,row3 + row4,...,row511 + row512)。
我考虑这样做的原因只是为了节省时间。
你能给我一些建议吗?谢谢!
这样的东西可能有用:
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行,依此类推。
行维度必须是偶数,显然来自您的问题陈述(成对添加行)。
在浏览器中编码,未经测试,可能包含错误