简单线性变换算法不起作用

时间:2013-09-01 04:50:27

标签: cuda parallel-processing

__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中编写了算法的串行实现,并且它可以工作。我唯一能想到的是某种线程内存访问问题。有帮助吗?感谢。

1 个答案:

答案 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);

您的代码将为各种矩阵大小生成正确的转置结果。