OpenCL的支持constant memory,這是你在尋找什麼。它的工作方式與全局內存相似,但確切位置可以根據實現而有所不同,並且它可以讓編譯器以不同的方式進行優化,因爲內核在內核執行期間不會被修改。
您會創建此緩衝區,將其標記爲只讀並從主機可訪問的數據進行復制。然後你只需將它傳遞到正常的內核:
float[] hugeData = { ... };
void run_kernel() {
// ...
cl_mem cl_hugeData;
hugeDataInOpenCL = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(hugeData), hugeData, &error);
// ...
clSetKernelArg(kernel, 0, sizeof(cl_hugeData), &cl_hugeData);
// ...
}
__kernel void mykernel (__constant float * hugeData, ...) {
// use hugeData however you want
}
想必你會想每一次的上下文創建緩衝區並重新使用它(就像你使用的內核),以避免過多的重複工作。
此外,您的數據足夠大,以致某些設備可能沒有足夠的可用內存,在這種情況下,您可以使用全局內存並將其標記爲只讀。 (這意味着您的內核有兩個版本,其中一個具有任意一種參數。)檢查clGetDeviceInfo
的CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE
並在運行時決定。
感謝您的回覆,但這不是我想到的。如果我沒有說清楚,我很抱歉。 數組應該在內核中編譯爲全局變量。我特別想避免將它們作爲參數發送給內核。數組實際上是數組的數組,其中有很多數組。 –
如何訪問數組? OpenCL真的只給你兩個選擇:1)參數,2)代碼。如果我們談論的是兆字節的數據,它幾乎必須是參數。 – willglynn
使用與內核一起編譯的函數可訪問數組。 如果我必須將這些數組設置爲內核參數,這將變得非常混亂。 –