相關範例及內容參考 http://ivanlife.wordpress.com/2011/05/09/time-cuda/
本篇介紹使用cudaEvent的方式
其他用法請參考上述網址
主要分成幾個部分:
- 宣告時間變數
cudaEvent_t start, stop; //用於紀錄開始與結束當下的時間
float time; //計算時間用 - create 事件
cudaEventCreate(&start);
cudaEventCreate(&stop); - 開始記錄時間
分別在計算時間的開頭及結束使用
cudaEventRecord(start, 0);
cudaEventRecord(stop, 0); - 同步CPU與GPU時間
避免device還沒做完,就先記錄結束時間
cudaEventSynchronize(stop);
=>後來發現cudaThreadSynchronize()跟cudaEventSynchronize()完全是兩個不同的function啊,為何當時都沒發現......
擺放的位置不太一樣,要注意。 - 計算時間
並將結果存入一開始宣告的float變數中
cudaEventElapsedTime(&time, start, stop);
完整範例如
cudaEvent_t start, stop;float time;cudaEventCreate(&start);cudaEventCreate(&stop);cudaMalloc((void **) &a_d, size); // Allocate array on devicecudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);cudaEventRecord(start, 0);// Do calculation on device:square_array <<< n_blocks, block_size >>> (a_d, N);cudaEventRecord(stop, 0);cudaEventSynchronize(stop);// Retrieve result from device and store it in host arraycudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);cudaFree(a_d);cudaEventElapsedTime(&time, start, stop);printf ("Time for the kernel: %f ms\n", time); |
需特別注意
4.同步CPU與GPU時間
否則計算的時間可能會有錯誤
關於cudaThreadSynchronize()
請參考
http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group__CUDART__THREAD__DEPRECATED_g6e0c5163e6f959b56b6ae2eaa8483576.html
但官方表示因為此函式名字無法明確表達出它的功能,傾向建議使用cudaDeviceSynchronize()
關於此函式,可從上方網址找到其連結
也可參見http://www.ptt.cc/bbs/C_and_CPP/M.1227119415.A.BB5.html 中的第六招
有中文說明
文章標籤
全站熱搜
