CUDA プログラムを実行すると、次の問題が発生します。
2 つのスレッドを持つ単一のブロックで単純なカーネルを呼び出します
CUDAkernel<<<1,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 です。
並列処理が間違っていませんか?
前もって感謝します!