2012-05-01 51 views
2

在CUDA發現連續指數涵蓋多個塊,從而incerase指數的範圍陣列,我們做一些事情是這樣的:的OpenCL相當於CUDA

主機端代碼:

dim3 dimgrid(9,1)// total 9 blocks will be launched  
dim3 dimBlock(16,1)// each block is having 16 threads // total no. of threads in 
        // the grid is thus 16 x9= 144.   

設備代碼

... 
...  
idx=blockIdx.x*blockDim.x+threadIdx.x;// idx will range from 0 to 143 
a[idx]=a[idx]*a[idx]; 
... 
...  

在實現上述情況下,OpenCL中的等效物是什麼? CUDA和OpenCL之間

+0

您可能需要更改設備端代碼。使用您啓動的配置,idx的範圍從0到11。你可能想做idx =(blockIdx.y * gridDim.x + blockIdx.x)*(blockDim.x * blockDim.y)+ threadIdx.y * blockDim.x + threadIdx.x;爲它具有範圍0 143之間和 –

+0

哎呀這是通過mnistake ...編輯塊暗淡,一個暗淡 – gpuguy

+0

所以,我沒有這樣說: 主機側: localWorkSize [0] = 16; globalWorkSize [0] = 9 * 16; 裝置側: INT I = get_global_id(0) 一個[IDX] = A [IDX] * A [IDX]; ... ... – gpuguy

回答

4

在主機上,當您使用排隊你clEnqueueNDRangeKernel內核,你必須指定全局和局部工作大小。例如:

size_t global_work_size[1] = { 144 }; // 16 * 9 == 144 
size_t local_work_size[1] = { 16 }; 
clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL, 
         global_work_size, local_work_size, 
         0, NULL, NULL); 

在你的內核,使用:

size_t get_global_size(uint dim); 
size_t get_global_id(uint dim); 
size_t get_local_size(uint dim); 
size_t get_local_id(uint dim); 

檢索全局和局部工作大小,分別指數,其中dim0x1y2z

的等效您idx因此將會更加簡單size_t idx = get_global_id(0);

OpenCL Reference Pages

1

等同功能:

blockIdx.x*blockDim.x+threadIdx.x = get_global_id(0) 

LocalSize = blockDim.x 

GlobalSize = blockDim.x * gridDim.x