2015-06-27 60 views
0

我遇到一些麻煩了解此代碼(在非超-Q運行兼容GPU):定時CUDA流

CHECK(cudaEventRecord(start, 0)); 

// dispatch job with depth first ordering 
for (int i = 0; i < n_streams; i++) 
{ 
    kernel_1<<<grid, block, 0, streams[i]>>>(); 
    kernel_2<<<grid, block, 0, streams[i]>>>(); 
    kernel_3<<<grid, block, 0, streams[i]>>>(); 
    kernel_4<<<grid, block, 0, streams[i]>>>(); 
} 

// record stop event 
CHECK(cudaEventRecord(stop, 0)); 
CHECK(cudaEventSynchronize(stop)); 

// calculate elapsed time 
CHECK(cudaEventElapsedTime(&elapsed_time, start, stop)); 
printf("Measured time for parallel execution = %.3fs\n", 
     elapsed_time/1000.0f); 

整個程序也可以找到here

問題是:在計算經過時間之前,我們如何確定所有其他內核都已完成?

在非Null流和其他啓動的流之間似乎沒有任何同步。即使停止事件是隊列中的最後一個,根據我的理解,其他流的其他內核似乎仍有可能運行。

回答

2

我發現專業CUDA C語言編程答案:在默認流指定

活動適用於所有上述操作在所有CUDA流。

換句話說,在所有流中的所有前面的操作完成後,默認非NULL流中的事件完成。