0

CUDA プログラムを実行すると、次の問題が発生します。

  1. 2 つのスレッドを持つ単一のブロックで単純なカーネルを呼び出します

    CUDAkernel<<<1,2>>>

  2. カーネル内で次のことを行います。

    int i = threadIdx.x; if (i==0){ waitabit(); }

    if (i==1){ waitabit(); }

そのため、両方のカーネル スレッドが同じ関数waitabit()を呼び出し、いくつかのクロック サイクルがほとんど無駄になります。

__device__ void waitabit(){
    clock_t start = clock();
        clock_t now;
        for (;;) {
        now = clock();
        clock_t cycles = now > start ? now - start : now + (0xffffffff - start);
            if (cycles >= 10000000  ) 
            {break;}
        }           
}

問題は、関数waitabit()がスレッドを 0.008 秒遅らせることです。私は当然、スレッドが並行して実行されると仮定したため、両方とも並行して 0.008 秒 (おおよそ) 停止し、カーネル全体の遅延はおよそ 0.008 秒になります。

しかし、そうではありません。カーネルはそれらをシリアルに実行し、遅延は 0.016、つまり 2*0.008 です。

並列処理が間違っていませんか?

前もって感謝します!

4

1 に答える 1

2

これは SIMT マシンです。任意の時点でワープによって処理される命令は 1 つだけです。制御フローの分岐が発生した場合、if パスと else パスの処理は、並列ではなく順次処理されます。warp のすべてのスレッドが最初の if ステートメントに到達すると、スレッド 0 が if パスを処理し、他のすべてのスレッドは何もしません。その後、ワープは if コンストラクトの最後に再同期し、並列処理を開始します。次に、2 番目の if ステートメントにヒットし、スレッド 1 のみが続行され、他のスレッドは待機します。次に、2 番目の if 構築の終わりに再び再同期し、ロックステップで処理を開始します。

したがって、例の最終的な効果は、2 つの if ステートメントが順番に処理されることです。これは予期されることです。

于 2013-02-28T18:42:37.290 に答える