0

これは CUDA プログラムでの私の最初の試みです。これは、それがすべきことです:

  1. ホスト メモリから 1D ピクセル配列を受け取る
  2. 各ピクセルは 1 つのスレッドで処理されます。「val」のみが読み取られ、「newval」のみが更新されるため、スレッドセーフです。同期を待ちます。
  3. 各ピクセルは 1 つのスレッドによって処理されます。「newval」を「val」にコピーします。
  4. この配列をホスト メモリに書き戻します。
  5. いくつかの異なるフレームに対して 2 ~ 4 を繰り返します。

ただし、新しい配列では、約 32000 個の変数のうち、適切な値を持つように見える変数は 2、3 だけです。残りはゼロです。

簡潔にするために計算を削除しました。

__global__ void kernel(Pixel *array, float dt)
{
    const unsigned int tid = threadIdx.x;
    Pixel *point = array + tid;
    //DO A BUNCH OF CALCULATIONS ON PIXEL KIND OF LIKE THIS
    point->newval = point->val + foo;
}

__global__ void copykernel(Pixel *array)
{
    const unsigned int tid = threadIdx.x;
    Pixel *point = array + tid;
    //COPY THE NEWVALS OVER TO THE OLD VALS IN PREPARATION FOR THE NEXT FRAME
    point->val = point->newval;
}

extern "C" bool runIt(const int argc, const char **argv, Pixel *inarray, Pixel **outarrays, int arraysize, int numframes, float dt)
{
    int memsize = arraysize*sizeof(Pixel);
    int i=0;

    Pixel *array;
    cudaMalloc((void **) &array, memsize);
    cudaMemcpy(array, inarray, memsize, cudaMemcpyHostToDevice);

    int numthreads = arraysize;
    dim3 grid(1,1,1);
    dim3 threads(numthreads,1,1);

    for(i=0;i<numframes;i++)
    {
        kernel<<<grid, threads>>>((Pixel *) array, dt);
        cudaThreadSynchronize();
        copykernel<<<grid, threads>>>((Pixel *) array);
        cudaThreadSynchronize();
        cudaMemcpy(array, outarrays[i], memsize, cudaMemcpyDeviceToHost);
    }
    cudaFree(array);
    return true;
}

デバイスのパラメータを正しく設定していないか、デバイス固有のキーワードの 1 つを間違っているか、重要な手順を忘れている疑いがあります。何か飛び出しますか?

4

1 に答える 1

1

それほど多くのスレッドを実行できるとは思いません。実行できるとしても、それはお勧めできません。スレッド数を 256 (2D の場合は 16x16) に設定してから、入力サイズに基づいてグリッドサイズを選択してみてください。

dim3 threads(256,1,1);
dim3 grid(arraysize/threads.x,1,1); //Careful of integer division, this is just for example

また、2 番目のコピーは正しくありません。あなたは切り替える必要がありarrayout_arrays

cudaMemcpy(outarrays[i], array, memsize, cudaMemcpyDeviceToHost);
于 2013-05-09T01:24:28.560 に答える