2012-09-21 42 views
1

我開始在OpenCL中進行一些開發,我的第一個目標之一是將大量數據移植到OpenCL。在OpenCL中使用大量恆定全局內存

這個特定的庫包含它的原生C形式的大量數據(內存大約20MB),其數組數組嚴格不變,以及一些允許用戶抽取(有時執行一些基本操作)來自這些數組的值。

我將所有這些數組放在一個巨大的C源代碼文件(大約1M行)中,我將它們與函數的代碼一起編譯到庫中。

我現在的問題是:是否有可能將具有必要內存限定符的這個巨大文件編譯成使用數據集和相關函數的OpenCL內核? 同樣,這些數組是恆定的,在執行過程中不會改變。

在此先感謝您的所有建議!

湯姆

回答

2

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 
} 

想必你會想每一次的上下文創建緩衝區並重新使用它(就像你使用的內核),以避免過多的重複工作。

此外,您的數據足夠大,以致某些設備可能沒有足夠的可用內存,在這種情況下,您可以使用全局內存並將其標記爲只讀。 (這意味着您的內核有兩個版本,其中一個具有任意一種參數。)檢查clGetDeviceInfoCL_DEVICE_MAX_CONSTANT_BUFFER_SIZE並在運行時決定。

+0

感謝您的回覆,但這不是我想到的。如果我沒有說清楚,我很抱歉。 數組應該在內核中編譯爲全局變量。我特別想避免將它們作爲參數發送給內核。數組實際上是數組的數組,其中有很多數組。 –

+0

如何訪問數組? OpenCL真的只給你兩個選擇:1)參數,2)代碼。如果我們談論的是兆字節的數據,它幾乎必須是參數。 – willglynn

+0

使用與內核一起編譯的函數可訪問數組。 如果我必須將這些數組設置爲內核參數,這將變得非常混亂。 –

相關問題