2012-09-24 35 views
1

我在寫一個多GPU並行算法。我面臨的一個問題是如果我將一個cl_mem推入多個設備並讓它們同時運行相同的內核,會發生什麼情況。內核將更改傳遞給設備的內存。OpenCL:發送相同的cl_mem到多個設備

編碼和調試OpenCL代碼非常耗時。所以在開始之前,我想從同行的Stackoverflow用戶那裏得到一些建議 - 我想知道在以下兩種情況下做這種事情的結果(例如,在執行過程中是否會出現異常?數據是否同步?當CL_MEM_COPY_HOST_PTR使用由該cl_mem指向相同的內存區域得到正確複製到設備等):

  1. 存儲與CL_MEM_COPY_HOST_PTR
  2. 創建的內存與CL_MEM_USE_HOST_PTR

回答

2

Appendix A of the OpenCL Specification解釋了在不同命令隊列之間共享的對象所需的同步。

基本上它說你應該使用OpenCL事件和clFlush來同步命令隊列之間的執行。 OpenCL實現將同步OpenCL上下文的不同設備之間的內存對象的內容。 USE/COPY _HOST_PTR沒有任何區別,但是USE_HOST_PTR將避免主機內存中數據的多餘副本。使用clEnqueueMapBuffer在末尾與主機同步位。

+0

它說:「一個命令隊列中的共享資源被其他命令隊列使用時修改共享資源的結果未定義。」這實際上就是我正在做的 - 在多個GPU上更改一個cl_mem。因此,程序開始運行一分鐘左右後,我會得到隨機藍屏...非常奇怪。 – aaronqli

+0

當多個設備上的多個命令隊列寫入同一個內存緩衝區但在此緩衝區的不同區域時,情況如何呢? – MiKom

+0

這是未定義的。如果我沒有記錯的話,就在同一附錄中提到。 –

3

我創建在保證數據w的OpenCL規範中沒有看到任何明確的內容不適合跨設備同步。我看不出OpenCL實現如何知道如何在多個設備上分配緩衝區以及如何在稍後再次聚合這些緩衝區。

我採用的方法是爲每個設備創建單獨的上下文,讀取,寫入和內核執行隊列。然後,我在每個設備上創建單獨的緩衝區,並排入寫入/讀取以將數據移入/移出設備。因此我明確地處理了所有這些。

我想要一個更好的解決方案,但至少上述方法的工作原理並不依賴於任何具體實現。