2010-08-23 106 views
5

我正在將CUDA應用程序(this if you must know)轉換爲OpenCL。原始應用程序使用C風格的CUDA API,只有一個流只是爲了避免在讀取結果時自動忙等待。OpenCL事件和命令隊列

現在我注意到OpenCL命令隊列看起來很像CUDA流。但在the device read command中,同樣在寫入和內核執行命令中,我也注意到事件的參數。所以我想知道,執行設備寫操作需要多少內核(例如,對一個內核的一次調用,然後對另一個內核的100次調用)以及設備讀取都需要依次進行?

  1. 如果我只是將它們順序排入同一個隊列,它們是否會按照它們在CUDA中的順序執行?
  2. 如果這不起作用,我可以/應該菊花鏈事件,使每個電話的等待列表前一個電話的事件?
  3. 還是應該將所有以前的事件添加到每個調用的等待列表中,例如,如果有N^2搜索依賴關係或其他事情?
  4. 或者我只需要爲每個呼叫分別設置event.wait(),就像它在AMD's tutorial中說的那樣?

謝謝!

回答

5

這取決於您如何創建命令隊列。在clCreateCommandQueue中,有一個屬性參數可以包含CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE,它可以在命令隊列中啓用非順序執行。

如果設置了該屬性,命令可能會按順序執行或並行執行,並且同步它們的唯一方法是使用事件。

當該屬性未設置時,命令將在隊列中順序執行。

+0

我不認爲看的一個地方。謝謝! – 2010-08-23 20:58:47

+0

我將不得不將我的陳述修改爲「大部分接受」。看起來事實上,許多內核按順序排列順序排列。但是,除非我使用事件*和*等待,否則即使讀/寫指定爲同步,緩衝區讀取和寫入也可能會亂序執行。另請參閱BOINC(boinc.berkeley.edu)中的atiopencl示例以獲取工作示例。 – 2010-08-28 17:42:58

+0

這不是CL的工作方式,請參閱OpenCL規範第5.1節創建命令隊列。如果你看到不同的行爲,這是一個實現錯誤(錯誤)。 – 2010-08-28 23:37:03