Предел рабочих элементов в OpenCL не соответствует теоретическому пределу CL_DEVICE_ADDRESS_BITS.Что происходит? - PullRequest
0 голосов
/ 31 января 2019

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

Прежде всего, давайтеПройдите контрольный список рабочих размеров:

  1. Ядро, которое я запускаю, является одномерным.
  2. Размер локальной рабочей группы установлен в CL_DEVICE_MAX_WORK_GROUP_SIZE.Я также убедился, что могу безопасно использовать эту группу рабочих размеров, поскольку почти не используется локальная память.
  3. Размер локальной рабочей группы всегда делит глобальный размер элемента.

Хорошо,теперь в проблему.Дело в том, что мое одномерное ядро ​​завершает выполнение с error code -36 (то есть CL_INVALID_COMMAND_QUEUE) тогда и только тогда, когда количество рабочих элементов (глобальный размер элемента) превышает 2 ^ 31 (я добавляю размер рабочей группы так, чтобыбыть выше 2 ^ 31, но все еще кратно).Теперь первое, что я делаю, когда запускаю свою программу, это проверяю, что CL_DEVICE_ADDRESS_BITS равен 64 битам.См. Ниже вместе с дополнительной информацией, которую я извлекаю в начале программы:

Device [3]: GeForce GTX 980
    Profile      : OpenCL 1.2 CUDA
    is available?: 1
    Global mem   : 4234280960 (4038 MB)
    Local mem    : 49152 (48 KB)
    Compute units: 16
    Max work group size: 1024
    Work size items: (1024, 1024, 64)
    Address space in bits: 64

Если вам интересно, это приложение, которое вычисляет много небольших заданий.Я уже разработал решение, чтобы пропустить это, чтобы назначить больше работы каждому рабочему элементу, чтобы было меньше рабочих элементов.Однако меня интересует, почему это происходит.Насколько я знаю, этого не должно происходить, поскольку адресное пространство составляет 64 бита.Я также позаботился о том, чтобы все переменные в программе были 64-битными, и что это никак не усекаетсяНа всякий случай, переменные:

size_t global_item_size;

, которые я также печатаю во время выполнения, как это, чтобы убедиться, что он содержит соответствующее значение:

fprintf(stdout, "Work items: %"PRIu64"\n", (uint64_t) global_item_size);

Наконец, ядро ​​получаетколичество рабочих элементов в качестве параметра внутри структуры, которая также составляет 64 бита:

 ulong t_work_items;

Я не могу представить себе причину сбоя, когда адресное пространство составляет 64 бита и все переменные, которые обрабатывают числорабочих элементов (2 ^ 31 + WORK_GROUP_SIZE) также 64-битные.Тем не менее, я предполагаю, что это возможно.На самом деле я не смог найти ссылку от кого-либо еще (ни в документации), который выполнил ядра с большим количеством рабочих элементов без сбоев.

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

Спасибо, что уделили время на прочтение этого!

EDIT1:

Я также проверил CL_DEVICE_MAX_WORK_ITEM_SIZES и получил Max work item sizes: (1024,1024,64).Однако я считаю, что это не то, что ограничивает количество рабочих элементов, поскольку согласно документации ссылка OpenCL :

Значения, указанные в global_work_size, не могут превышать диапазон, заданный sizeof(size_t) для устройства, на котором выполнение ядра будет поставлено в очередь.Размерof (size_t) для устройства можно определить с помощью CL_DEVICE_ADDRESS_BITS в таблице запросов устройств OpenCL для clGetDeviceInfo.Если, например, CL_DEVICE_ADDRESS_BITS = 32, т.е. устройство использует 32-разрядное адресное пространство, size_t - это 32-разрядное целое число без знака, а значения global_work_size должны находиться в диапазоне 1 .. 2 ^ 32 - 1. Значения, выходящие за пределы этого диапазона, возвращаютошибка CL_OUT_OF_RESOURCES.

Я не получаю ошибку CL_OUT_OF_RESOURCES, поскольку мое адресное пространство составляет 64 бита.Что может быть не так?

...