2014-03-03 54 views
0

任何機構能告訴我推力程序是阻塞還是非阻塞? 我想不想來一次吧,這裏是代碼snippets-推力變換性能號碼

代碼片段-1:

clock_t start,end; 
start = clock(); 
thrust::transform(a.begin(), a.end(), b.begin(), thrust::negate<int>()); 
end = clock(); 

代碼片段 - 2

clock_t start,end; 
start = clock(); 
thrust::transform(a.begin(), a.end(), b.begin(), thrust::negate<int>()); 
cudaThreadSynchronize(); 
end = clock(); 

代碼片段-1代碼片段相比,花費的時間非常少 - 爲什麼會發生這種情況?以及哪一種是正確的方式來計時推力程序,以便我可以將其與我的並行代碼進行比較。

回答

4

我不相信Thrust正式定義了哪些API被阻塞,哪些API在文檔中的任何地方都是非阻塞的。然而,像你的例子那樣的變換調用應該在單個後端關閉操作中執行(這將轉換爲單個內核調用,而不需要主機設備數據副本),並且應該是異步的。

你的第二個代碼片段是接近正確的方式來時間推力操作,但要注意使用低分辨率的時間源是

  1. clock()普遍實施,可能不適合定時這些類型的操作。您應該找到更高分辨率的主機源計時器,或者更好的是,使用CUDA事件API來計時代碼。您可以看到如何使用這些API in this question-answer pair的示例。
  2. cudaThreadSynchronize自CUDA 4.0發佈以來已被棄用的API。您應該改用cudaDeviceSynchronize