2017-04-04 75 views
3

假設我使用clEnqueueWriteBuffer將數據複製到設備,並且假設數據是RGB值(unsigned char s)的緩衝區。我想先通過操作輸入緩衝區(例如通過覆蓋R組件)來將圖像轉換爲灰度,然後我想將生成的圖像調整爲輸出緩衝區。然後我會使用clEnqueueReadBuffer將輸出複製回主機內存。由於我不能編寫一個包含所有邏輯的單個內核(因爲OpenCL處理的內在無序性),所以我在考慮使用以下序列:clEnqueueWriteBuffer - 兩個clEnqueueNDRangeKernel s - 。我可以在相同的設備緩衝區中一個接一個地調用OpenCL內核嗎?

這種方法是否正確?規範中的哪些地方可以找到更多關於此的細節?

回答

1

如果所有在同一個命令隊列和命令隊列是一個有序的類型,那麼它的工作。

有序隊列按順序執行所有命令。每個命令都會查看最新命令的結果。

這裏: https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/clCreateCommandQueue.html

它說

例如,如果一個應用程序調用clEnqueueNDRangeKernel到 執行內核後跟一個clEnqueueNDRangeKernel執行 內核B,應用程序可以假定內核首先完成並且 然後內核B被執行。如果通過存儲器內核對象輸出的 被輸入到內核B,則內核乙將看到 存儲器中的對象由內核A的執行所產生如果


注意正確的數據:將灰度如果不使用原始灰度級,重新調整尺寸可能更有效,而且尺寸縮小而不是升級。如果只需要重新調整大小的圖像,則可以在單內核中同時執行灰度。當重新調整大小的工作項目爲結果像素選取一些像素時,可以對結果像素應用灰度。

如果您要同時使用灰度原始圖像和灰度調整大小的圖像,可以有兩個輸出(不改變原始圖像)並且有兩個並行命令隊列以更快完成整個工作(如果內核啓動開銷相當於內核執行開銷),但這需要兩個隊列同步點,對於非常小的圖像可能會變慢(一個隊列需要查看其他隊列的緩衝區副本,並且兩個隊列必須稍後才能完成兩個結果)。來自兩個隊列的兩個內核可以使用相同的緩衝區進行只讀,而不會有任何問題。

只注意正確的參數設置爲內核進行排隊命令隊列(有沒有保證,他們不會立即開始)

根據您的需要,但設置的參數是不是你可以有很多執行內核之前隊列操作在開始時需要被照顧。

相關問題