2012-07-12 39 views
0

我有幾個查詢,我需要一些說明..很抱歉,如果他們似乎是非常基本的。啓動內核後在主機上的執行流程

  1. 當我們開始使用clEnqueueNDRangeKernel內核中,究竟發生了主機代碼,它等待內核完成或..?

  2. 假設我們有多個內核,在這種情況下會發生什麼?這是否會發生,如果其中一個內核已經完成,主機是否可以從該內核檢索結果,而其他人仍在進行計算。

  3. 我正在閱讀clCreateBuffer的OpenCL規範(link here)。檢查標誌CL_MEM_USE_HOST_PTR的描述。爲了您的方便,我在此發佈了它: 「它表示應用程序希望OpenCL實現使用host_ptr引用的內存作爲內存對象的存儲位。」

我不能得到究竟他們所說的「應用」和「OpenCL實現」。此外,它還表示「允許OpenCL實現緩存緩衝區內容。」

回答

1
  1. 內核模塊排入和異步執行的,clEnqueueNDRangeKernel立即返回,主機程序繼續執行。要使此調用保持同步,請等待來自最後一個可選參數的事件,或者調用clFinish以等待所有排隊的命令。

  2. 如果內核屬於同一個命令隊列,多個內核按照它們入隊的順序依次執行。

  3. 應用程序意味着您的代碼在主機上運行。 OpenCL實現是一個實現OpenCL接口的庫。有幾個OpenCL的實現,如AMD,NVIDIA等

的OpenCL程序包含三個部分:主機代碼在運行的CPU,OpenCL的庫(實現),並在GPU上運行的內核模塊。

+1

對於點2:爲了保證執行,除非使用CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE創建命令隊列。 – 2012-07-12 16:01:10

+0

好的,謝謝。所以如果我在NDRangeKernel之後有一個clEnqueueReadBuffer,並且沒有給出任何等待事件的信息。進一步,clEnqueueReadBuffer也是異步的,即不等待指定的事件。因此,在這種情況下,clEnqueueReadBuffer將如何執行......它是否開始逐步讀取數據,即它讀取已由內核處理的數據,並繼續進行類似的讀取操作,以便處理更多數據並使內核可用。 .. ?? – Nike 2012-07-12 16:39:58

+0

對於第二點:什麼足以讓所有的內核同時啓動,只有單獨的命令隊列或所有的上下文,程序..等必須分開爲每個內核? – Nike 2012-07-12 16:43:59

相關問題