2014-02-10 33 views
0

假設我們通過調用cudaEventRecord來記錄兩個cuda事件A和B,那麼在我們做任何同步之前,有什麼辦法來判斷A是否會在B之前或之後發生?例如,如果我有這些代碼:有沒有辦法查詢兩個cuda事件的順序?

kernelA<<<1,1>>>(...); 
cudaEventRecord(A, 0); 
kernelB<<<1,1>>>(...); 
cudaEventRecord(B, 0); 

然後乙應該發生在肯定的A後,但我怎麼會知道這給了兩個手柄?在另一種方式,我怎麼會寫這樣的功能:

bool judge_order(cudaEvent_t A, cudaEvent_t B) {...} 

,使得如果將B.

前,當我想一個內存管理器,以便發生

的問題是它返回true有效地重用先前內核啓動中已經使用的內存。

+1

我不認爲這是可能的只是通過檢查事件本身。事件結構是不透明的,您僅限於通過[event API](http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__EVENT.html#group__CUDART__EVENT)表達的內容。然而你可以構建一個包裝宏或者一些包裝函數,它將每次調用時間標記爲'cudaEventRecord,並在表中存儲事件句柄,時間戳和流ID,並根據該表構建您自己的'judge_order'函數。 –

+0

謝謝你的解決方案!我想知道cuda是否有這種支持。現在沒有了,我會按照你所描述的來實施我的! – shaoyl85

回答

1

CUDA中的所有內容都安排在流上。這包括內核執行,內存傳輸和事件。默認情況下,所有操作均在數據流0上運行。

每個數據流都嚴格線性處理。即在你的例子中,保證在處理eventA之前kernelA已經完成。通過查詢一個事件的狀態,你可以判斷它是否已經被處理,而不用等待它。

然而,分開的流可以按任何順序處理。如果您爲每個內核/事件使用單獨的流,則不保證特定的處理順序。

所有這些在CUDA編程指南中都有更好的解釋。

+0

謝謝!但是,如果我收到兩個事件句柄A和B,我將如何判斷哪一個會首先發生?換一種方式,我該如何編寫這個函數:'bool get_order(cudaEvent_t A,cudaEvent_t B){}',如果A在B之前發生,則返回true? – shaoyl85

+0

據我所知,沒有API比較事件的「正在處理的位置」。你將不得不記住你自己安排的順序。如果他們在單獨的流中,訂單是不確定的! – LumpN

+1

@ shaoyl85 - 如果兩個事件都已經發生,您可以將它與任意'start'事件進行比較,並檢查'cudaEventElapsedTime'經過了多少時間。 –

相關問題