2013-08-01 143 views
4

我想了解當我創建一個具有隻讀屬性的緩衝區並將其與__constant地址空間限定符一起用於內核或與const __global地址空間一起使用時預選賽。OpenCL:__constant內存和const之間的區別__global內存

我已經找到了那些不是真正爲我的問題的答案,但它們包含一些有用的信息:

如果我理解好,GPU內存中的分配發生在clCreateBuffer函數調用中。所以我不明白的是編譯器如何決定緩衝區是在常量內存(它有一個64 KB的限制)還是在全局內存中。 (我知道在大多數情況下,常量內存是全局內存空間的一部分。)如果它取決於地址限定符,則意味着使用const __global可以忽略64 KB限制。

__constantconst __global之間的性能有任何區別嗎? __global內存可能被緩存,所以它們都是隻讀的並且(可能)被緩存。 (來源:3.3內存模型/全局內存部分和圖3.3; http://www.khronos.org/registry/cl/specs/opencl-1.x-latest.pdf#page=24

+0

我的猜測是依賴於OpenCL實現和/或硬件架構。 –

回答

1

根據我的經驗,兩者之間沒有概念上的區別,它們都暗示指向的數據是隻讀的。根據供應商使用的實施情況,差異才顯而易見。

例如,在nvidia GPU上,用__constant標記的內存被緩存(我認爲所有當前設備的緩存大小爲每個多處理器8KB)。需要注意的一點是,如果不同的工作項訪問不同的地址,則訪問此高速緩存將被序列化,因此我發現它對傳遞工作組內常數不變的參數結構非常有用。如果您查看CUDA編程指南中關於常量內存的部分,您將更好地瞭解它如何工作。標記爲const __global的內存不會被緩存我相信,它只是告訴編譯器在嘗試更改指向值時拋出一個錯誤。

我不知道AMD是否做類似類型的緩存在他們的硬件

希望幫助

+0

你確定緩存的大小是64KB嗎?我認爲整個__constant內存空間是64KB。 (請參閱CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE) –

+0

你確實是對的,我錯了。雖然總大小爲64KB,但每個多處理器的緩存爲8KB。我已更新我的答案以糾正此問題。 – mcd40