0
__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 でアルゴリズムのシリアル実装を作成しましたが、動作します。私が考えることができる唯一のことは、ある種のスレッドメモリアクセスの問題です。何か助けはありますか?ありがとう。

4

1 に答える 1

1

コメントがすでに指摘しているように、コードは、特定したサンプル入力ケースに対して正しく機能します。

[0, 1, 2, 3, 4, 5, 6, 7, 8]

また、指定した結果が得られない場合、エラーは表示されたコードの外にあります。ただし、配列を転置しようとしているようです。

このコードは、一般的なケースでは機能しません (たとえば、2x2 配列を試してください: [0, 1, 2, 3]) 。

意図が配列を転置することである場合、特にこのコード行は正しくありません。

    int column = (threadidx+3) % (*height);

次のように変更した場合:

    int column = (threadidx) % (*width);

コードは、さまざまな行列サイズに対して正しい転置結果を生成します。

于 2013-09-01T14:02:21.863 に答える