__global__
void transpose(double *input, double *output, int *width, int *height)
{
int threadidx = (blockIdx.x * blockDim.x) + threadIdx.x;
int row = threadidx / (*width);
int column = (threadidx+3) % (*height);
output[column * (*height) + row] = input[threadidx];
}
上面是我的线性变换内核。对于[0,1,2,3,4,5,6,7,8]的输入矩阵,输出矩阵应该是[0,3,6,1,4,7,2,5,8],但是当我使用上述示例运行此代码时,输出为[0,3,6,0,0,0,0,0,0]。我已经在Python中编写了算法的串行实现,并且它可以工作。我唯一能想到的是某种线程内存访问问题。有帮助吗?感谢。
答案 0 :(得分:1)
正如评论已经指出的那样,您的代码恰好适用于您已识别的示例输入案例:
[0, 1, 2, 3, 4, 5, 6, 7, 8]
如果您没有收到您指出的结果,那么错误超出了您显示的代码。但是,您似乎正在尝试转置数组。
此代码不适用于一般情况(例如尝试2x2数组:[0, 1, 2, 3]
)
如果您的目的是转置数组,那么这行代码尤其不对:
int column = (threadidx+3) % (*height);
如果您将其更改为:
int column = (threadidx) % (*width);
您的代码将为各种矩阵大小生成正确的转置结果。