私はCUDAプログラムが一定のサイズの行列を計算するのにどれくらい時間がかかりますか?たとえば、10x10,100x100,500x500,100x1000などです。CUDAタイムイベント
しかし、結果は私が期待していたものではありません。グラフの数値は、予想される数値ではありません。行列のサイズが大きくなると、計算時間が短くなる。
例えば、ここでは(1000回のランからの)平均時間は次のとおりです。 10×10:0.032768s 100×100:0.068960s 500×500:0.006336s 1000×1000:0.018400s
時間は、その後アップ再び、ダウン何が起きているのですか?特定のポイントで数字がピークになってはいけませんか?なぜこのようなローラーコースターで行くのですか? MAXTHREADSが1024であり、大きさがIがマトリクス状に持つ要素の量である
int blocksNeeded=0;
cudaError_t cudaStatus;
blocksNeeded=(size/MAXTHREADS)+1;
int threadsPerBlock = MAXTHREADS/blocksNeeded+1;
cudaEvent_t start, stop;
float elapsedtime;
.
.
.
.
.
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
addKernel<<<blocksNeeded, size>>>(dev_c, dev_a, dev_b,size);
cudaStatus = cudaDeviceSynchronize();
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedtime, start, stop);
cudaEventDestroy(start);
cudaEventDestroy(stop);
:ここ
は実際のタイミングコードが実行されている方法です。 I. 10x10マトリックスには100個の要素があります。あなたは、カーネルの呼び出しで2番目のパラメータは、各ブロックに起動するスレッドの数ではなく、合計数です
addKernel<<<blocksNeeded, MAXTHREADS>>>(dev_c, dev_a, dev_b,size);
でカーネルを呼び出す必要があります
__global__ void addKernel(float *c, float *a, float *b,int size)
{
int idx = blockDim.x * blockIdx.x + threadIdx.x;
if(idx < size)
c[idx] = a[idx] + b[idx];
}
カーネル実行の戻りコードを確認していますか?たぶん500で、カーネルは起動に失敗しました – flipchart
どのようにブロックを計算していますか? –
cudaDeviceSynchronizeなしで試しましたか?タイミングに必要ではなく、結果に影響を与える可能性があります(記述した方法ではない場合でも)。そして、他のコメントに+1してください。 – jmsu