2013-12-18 2 views
2

У меня возникли проблемы с пониманием размеров рабочей группы OpenCL 2D.Размеры рабочей группы OpenCL 2D

Я хочу создать матрицу N x N и дать каждой строке набор рабочих групп для вычисления. Например, если у меня есть матрица размером 1000 x 1000, я бы хотел иметь 10 рабочих групп в каждой строке (поэтому каждая рабочая группа будет вычислять 100 элементов) и 10000 рабочих групп (10 * 1000).

Это часть моего кода:

size_t global_pattern[] = {n,n,0}; //My matrix pattern 
size_t group_pattern[] = {workgroups_per_row, n, 0}; //My workgroups pattern 

И некоторые строки ниже:

err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_pattern, 
          group_pattern, 0, NULL, NULL); 

Что выходит из строя. Код ошибки равен -54, который ссылается на #define CL_INVALID_WORK_GROUP_SIZE -54.

Является ли моя инициализация массива group_pattern правильной? Я имею в виду, что первый элемент массива относится к координате x, а второй - к координате y, как я предполагаю? Что такое математика?

В целях отладки я также попытался запустить его с пустым ядром (просто чтобы убедиться, что это не мой код). Я также попытался поменять первый и второй элементы в массиве group_pattern.

+0

«Что не получается». Итак, что «не удается»? Сбой, SEG_FAULTS, дает ошибку, в таком случае какой? – DarkZeros

+0

err! = CL_SUCCESS, ожидаемое значение. Если я попытаюсь запустить его как одномерную проблему, это сработает. Я не уверен, что с моим кодом я реализовал намеченную семантику, которую я описал с моим вопросом. Есть ли способ иметь более конкретные сообщения об ошибках? Значение err равно -54, если это может помочь. – Kami

+0

Если ошибка не увенчалась успехом, то есть ошибка да, но есть 64 типа кодов ошибок ... – DarkZeros

ответ

4

Когда вы говорите:

size_t global_pattern[] = {n,n,0}; //My matrix pattern 
size_t group_pattern[] = {workgroups_per_row, n, 0}; //My workgroups pattern 

И затем использовать его как:

err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_pattern, group_pattern, 0, NULL, NULL); 

Это явно не так. То, что вам нужно передать в ядро, - это local_size AKA, размер одной группы. Не так, как вы хотите разделить свое пространство.

Так было бы, как это для вашего случая:

size_t global_size[] = {n,n}; //My matrix pattern 
size_t group_pattern[] = {workgroups_per_row, n}; //My workgroups pattern 
size_t local_size[] = {global_size[0]/group_pattern[0], global_size[1]/group_pattern[1]}; //My workgroups pattern 

err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_pattern, local_size, 0, NULL, NULL); 

EDIT: Если у вас есть CL_INVALID_WORK_GROUP_SIZE, то причины может быть, что:

  1. Вы указываете локальный размер, который а не целочисленный делитель глобального размера
  2. Устройство не поддерживает локальные размеры, размер которых не определен
+0

Это -54 Я редактировал свой вопрос. – Kami

+0

Я обновил с вероятными причинами CL_INVALID_WORK_GROUP_SIZE (-54) – DarkZeros

+0

Это сработало. Спасибо. Я просто ошибся в семантике шестого параметра. – Kami

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