2017-10-07 88 views
1

OpenCL最佳實踐指南(https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf)在3.1.3節中建議使用clFlush以確保命令以正確的順序發生,例如,處理不數據傳輸之前發生:重疊的傳輸和執行:確保按照正確的順序執行命令

  1. 傳輸的數據隊列0
  2. clFlush的隊列0
  3. 運行內核隊列0,傳輸數據的隊列1
  4. clFlush的隊列0和隊列1
  5. 爲隊列1運行內核並檢索隊列0的數據
  6. clFlush對於它們都是
  7. 檢索隊列1的數據

這裏的答覆https://stackoverflow.com/a/12389713/4634819建議使用事件來實現,因爲它看起來是相同的。

我的問題是:在這種情況下,我做得對嗎?同時做兩個事件(避免同時執行),這兩個事件都是clFlush?它們中的哪一個使用是否重要?

回答

4

clFlush只確保入隊函數將數據傳輸或內核執行排入隊列,但它不能確保您調用的函數完成。有多種情況需要使用事件:

1 - 如果您使用非阻塞呼叫進行數據傳輸,則需要使用事件以確保在開始執行之前完成了所有事件的傳輸你的內核,當你複製回主機時,你需要等待讀事件完成。

2 - 如果您在兩個隊列中執行的內核之間存在依賴關係,那麼您必須再次使用事件以正確的方式對內核進行排序。

所以你的問題取決於你在內核執行和你是否使用非阻塞調用傳輸數據之間有什麼樣的依賴關係。如果你沒有依賴關係,並且你正在使用阻塞調用進行數據傳輸,clFlush將完成這項工作。否則,你需要事件。

+0

謝謝!一切都很清楚:) – vgeclair

相關問題