2015-07-13 2 views
0

Я пишу код для добавления двух матриц размером 1024 * 1024 каждый. Таким образом, мой размер работы должен быть 2, а рабочий объем всей работы должен быть 1024 * 1024. Я хочу установить размер каждой рабочей группы в 64 * 64. Как мне это достичь?clEnqueueNDRangeKernel с рабочим размером = 2

Так что мой код должен быть что-то вроде: -

clEnqueueNDRangeKernel(cl_command_queue command_queue,cl_kernel kernel,cl_uint work_dim,const size_t *global_work_offset, 
         const size_t *global_work_size,const size_t *local_work_size, 
         cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event) 

local_work_size=64*64 где, global_work_size=1024*1024, work_dim=2. Как получить отдельные элементы в моем коде ядра?

Это мой код ядра: -

__kernel void hello(__global int ** A,__global int ** B,__global int ** C) 
{ 
     int x = get_global_id(0); 
    int y = get_global_id(1); 
    C[x][y]=A[x][y]+B[x][y]; 
} 

ответ

1

Ваш запуск ядра будет выглядеть следующим образом:

size_t global[2] = {1024, 1024}; 
size_t local[2] = {64, 64}; 
clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global, local, 0, NULL, NULL); 

и ядро ​​будет восстановить свои показатели, как это:

kernel void foo(...) 
{ 
    int x = get_global_id(0); 
    int y = get_global_id(1); 
    ... 
} 

В стороне, большинство устройств OpenCL, с которыми я столкнулся, имеют максимальный размер рабочей группы 1024, что будет означать, что они не будет поддерживать размер рабочей группы 64x64.


Поскольку вы можете использовать только 1D буферы в OpenCL, вам необходимо вычислить свои линейные массивные индексы вручную. Вот как ваше простое матрица дополнение ядро ​​будет выглядеть:

__kernel void hello(__global int *A,__global int *B,__global int *C, int width) 
{ 
    int x = get_global_id(0); 
    int y = get_global_id(1); 
    int index = x + y*width; 
    C[index] = A[index] + B[index]; 
} 
+0

Если я оставил локальный размер пустого (NULL), будет ли быть какие-либо проблемы? – ikk

+0

@ikk Нет, если ваше ядро ​​не предполагало, что размер рабочей группы будет чем-то конкретным (например, если он использует локальную память). – jprice

+0

Итак, каков был бы самый эффективный размер работы? Если глобальный размер составляет 1024 * 1024, тогда я должен установить локальный размер как 8 * 8 с учетом локального размера в большинстве устройств> = 64 – ikk

Смежные вопросы