2

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 で同等のものは何ですか?

4

2 に答える 2

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);

グローバルおよびローカルの作業サイズとインデックスをそれぞれ取得します。ここで、dim0for x1for y、および2forzです。

したがって、あなたの意志に相当するものはidx単純にsize_t idx = get_global_id(0);

OpenCL リファレンス ページを参照してください。

于 2012-05-02T15:25:47.090 に答える