Сколько потоков (или рабочих элементов) может работать одновременно? - PullRequest
18 голосов
/ 15 апреля 2011

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

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

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

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

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

Буду очень признателен за любые предложения.

1 Ответ

22 голосов
/ 18 апреля 2011

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

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

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

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

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

...