2016-05-13 35 views
0

我正在嘗試運行以下關於OpenCL的代碼。在覈函數,我會定義一個數組int arr[1000] = {0};OpenCL變量或內核成本內存中的數組?

kernel void test() 
{ 
    int arr[1000] = {0}; 
} 

然後,我將創建N線程來運行內核。

cl::CommandQueue cmdQueue; 
cmdQueue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(N), cl::NullRange); // kernel here is the one running test() 

我的問題是,因爲我們知道的OpenCL將並行運行的線程,這是否意味着,峯值內存會N * 1000 * sizeof(int)

+0

堆棧空間呢? –

回答

0

這不是OpenCL的方式(是的,這就是我的意思:)。

內核函數工作從主機(CPU)傳入內核數 - 所以你最好使用clCreateBuffer分配主機上的陣列和設置使用clSetKernelArg的ARG。您的內核不聲明/分配設備內存,只是將其作爲__global參數接收。現在,當您使用clEnqueueNDRangeKernel運行內核時,OpenCL實現將分配1000個整數,並在每個整數上運行一個線程。

如果,另一方面,你的意思分配每個工作項目(設備線程)1000個整數,你的計算是正確的(是的,它們的價格從本地池內存),但它可能不會工作。 OpenCL工作項只能訪問本地內存(請參閱here瞭解如何針對您的設備進行檢查),這是非常有限的。

+0

我認爲我的意思是後者,即在每個線程中分配1000個整數。因爲數組是每個線程的私有變量,對嗎?所以我認爲在理論上最多會有N * 1000 * sizeof(int)內存成本。 –

+0

是的,這是正確的。 – Ani

+0

這不會是N * 1000 *的sizeof(int)的,這將是M * 1000 *的sizeof(int)的其中M是本地工作組大小,這是未指定,因此它最多的運行時間。 – Dithermaster