2012-10-03 61 views
0

我可以調用clEnqueueWriteBuffer()上目前正在由GPU設備上運行的內核寫入緩衝區中? 可以說我不在乎數據的衝突,我知道我在做什麼。 OpenCL實現是否允許這樣做?約clEnqueueWriteBuffer()內核執行

回答

1

如果命令隊列不與「無序EXEC的」標誌創建,所有排隊的命令依次執行(在單個命令隊列)。在這種情況下,寫入緩衝區和內核將不會同時執行。 在其他情況下,可能會同時執行這些命令,並且行爲將是未定義的。

+0

非常感謝埃裏克! – Thejas

1

值得爲你的實現運行一個測試,但是從我記得我通過OpenCL與AMD和NVIDIA合作的工作來看,即使指定亂序標誌,隊列也是有序的。

即使該命令將亂序執行,緩存由設備完成可能不會讓你看到在內核中的變化。對於全局內存以及隨後的內存,OpenCL規範指出:

全局內存。該內存區域允許對所有工作組中的所有工作項目進行讀/寫訪問。工作項可以讀取或寫入內存對象的任何元素。 讀和寫全局內存可能會因 設備的能力被緩存。

因此,即使您能夠寫入設備內存,內核也不太可能讀取這些更改。在你的情況下,寫作時,我認爲內核寫入會在寫入緩衝區發生之前提交,但似乎OpenCL規範在這一點上有意含糊(可能允許APU類型的數據訪問)。

0

如果你真的試試這個,你需要兩個不同的命令隊列;這就是你如何重疊DMA和計算。我建議不要這樣做,因爲內核和轉移編寫的任何區域都會有不一致的結果。