- ベストアンサー
CUDA 実行時間測定
CUDAで計算の実行時間の測定の練習をしています. 計算対象は乱数ではなくある一定の値で総和計算等を行っているのですが,実行時間にかなりばらつきが生じてしまいます. 同じ計算なのである一定の時間にほとんど揃うと考えていましたがそうなりません. このような場合は設定に問題があるのでしょうか? 簡単な計算なので実行時間の平均は0.25msecで,誤差が0.1msec~0.5msecとなってしまっています.
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
どこの時間を測定しているのか分かりませんが、こちらの結果を載せておきます。 GPUの初期化時間が出ていませんが、およそ1ms強くらいのようです。質問文を参考に似た様な状況と思われるプログラムを作りました。openACCですので、効率はあまり良くないかもしれません。 GPUはGTX 560です。 main NVIDIA devicenum=0 time(us): 948,029 14: compute region reached 1000 times 14: data copyin reached 1000 times device time(us): total=659,572 max=683 min=657 avg=659 15: kernel launched 1000 times grid: [7813] block: [128] device time(us): total=271,641 max=450 min=271 avg=271 elapsed time(us): total=279,826 max=462 min=277 avg=279 15: reduction kernel launched 1000 times grid: [1] block: [256] device time(us): total=16,816 max=40 min=16 avg=16 elapsed time(us): total=23,813 max=203 min=22 avg=23 1000回ループさせて測っています。maxが大きいものもありますが、avgとminがほぼ同じですので誤差はあまりないようです。まれに時間のかかる事もある程度のようです。 計算量が少ないのでもう少し長くして測られてはいかがでしょうか。 結果を見て分かるように、メモリ転送がかなりの時間を占め、ここには出力されていませんが、GPUの初期化がもっとも時間がかかっています。ちなみにこのプログラムはCPUだけで実行した方がかなり速いです。 実際のプログラムは #include <stdio.h> #include <stdlib.h> #define N1 1000000 int main() { float sum, x[N1]; for(int j=0; j<1000; j++){ for(int i=0; i<N1; i++) x[i]=rand()/(float)RAND_MAX; sum=0.0; #pragma acc kernels for(int i=0; i<N1; i++) sum=sum+x[i]; //printf("%f\n", sum); } }
お礼
丁寧な回答ありがとうございました.とりあえずテストと言うことで要素数を小さくしていました.自分はランダムな数値を使っていないため,最少と平均に20usの差が出ているのがすごく気持ち悪い感じです.もう少し設定やプログラムをいじってみます.また質問を投稿するかもしれません.もし目にとまった時は知恵をお貸しください.よろしくお願いします.ありがとうございました.