Сколько потоков (или рабочих элементов) может работать одновременно?

Я новичок в программировании GPGPU, и я работаю с реализацией OpenCL в NVIDIA.

Мой вопрос заключался в том, как вычислить предел устройства GPU (в количестве потоков).
Из того, что я понял, существует несколько рабочих групп (эквивалент блоков в CUDA), которые содержат ряд рабочих элементов (~ cuda thread).

  • Как получить количество рабочей группы, присутствующей на моей карте (и которая может работать одновременно), и количество рабочих элементов, присутствующих в одной рабочей группе?

  • К чему соответствует CL_DEVICE_MAX_COMPUTE_UNITS?
    Спецификация спецификации khronos ( "Число параллельных вычислительных ядер на устройстве OpenCL" ). В чем разница с ядром CUDA, указанным в спецификации моей графической карты. В моем случае openCL дает 14, а мой GeForce 8800 GT имеет 112 ячеек, основанных на веб-сайте NVIDIA.

  • Соответствует ли CL_DEVICE_MAX_WORK_GROUP_SIZE (512 в моем случае) общее количество рабочих элементов, заданных определенной рабочей группе, или количество рабочих элементов, которые могут работать одновременно в рабочей группе?

Любые предложения будут чрезвычайно оценены.

Ответы

Ответ 1

В стандарте OpenCL не указывается, как модель абстрактного исполнения, предоставляемая OpenCL, сопоставляется с оборудованием. Вы можете присвоить любое число T потоков (рабочих элементов) и предоставить размер рабочей группы (WG), по крайней мере, следующие ограничения (подробнее см. В описании OpenCL spec 5.7.3 и 5.8):

  • WG должна делить T
  • РГ должна быть не более DEVICE_MAX_WORK_GROUP_SIZE
  • РГ должна быть не более KERNEL_WORK_GROUP_SIZE, возвращенной GetKernelWorkGroupInfo; он может быть меньше размера рабочей группы max, если ядро ​​потребляет много ресурсов.

Реализация управляет выполнением ядра на оборудовании. Все потоки одной рабочей группы должны быть запланированы на одном "многопроцессорном", но один мультипроцессор может одновременно управлять несколькими рабочими группами.

Потоки внутри рабочей группы выполняются группами из 32 (NVIDIA warp) или 64 (фронт волны AMD). Каждая микро-архитектура делает это по-другому. Более подробную информацию вы найдете на форумах NVIDIA и AMD, а также в различных документах, предоставляемых каждым поставщиком.

Чтобы ответить на ваш вопрос: количество потоков не ограничено. В реальном мире ваша проблема ограничена размером входов/выходов, то есть размером памяти устройства. Для обработки буфера с плавающей запятой объемом 4 ГБ вы можете вставить очереди 1G, например WG = 256. Устройство должно будет запланировать 4M рабочих групп на своем небольшом числе (например, от 2 до 40) мультипроцессоров.