Количество вычислительных блоков, соответствующих количеству рабочих групп - PullRequest
13 голосов
/ 17 февраля 2012

Мне нужно немного разъяснений.Я разрабатываю OpenCL на своем ноутбуке с небольшим графическим процессором NVIDIA (310M).Когда я запрашиваю устройство на CL_DEVICE_MAX_COMPUTE_UNITS, результат равен 2. Я читаю, что число рабочих групп для запуска ядра должно соответствовать количеству вычислительных единиц ( Гетерогенные вычисления с OpenCL , Глава 9, стр.186), иначе это может привести к потере слишком большого количества ресурсов глобальной памяти.

Кроме того, в чипе предусмотрено 16 ядер cuda (что, по-моему, соответствует PE).Значит ли это теоретически, что наиболее эффективная настройка для этого графического процессора, касающаяся глобальной памяти, состоит в том, чтобы иметь две рабочие группы по 16 рабочих элементов в каждой?

Ответы [ 2 ]

17 голосов
/ 17 февраля 2012

Хотя установка количества рабочих групп равной CL_DEVICE_MAX_COMPUTE_UNITS может быть разумным советом для некоторых аппаратных средств, безусловно, не является на графических процессорах NVIDIA.

В архитектуре CUDA вычислительный модуль OpenCL является эквивалентом мультипроцессора (который может иметь 8, 32 или 48 ядер), и они предназначены для одновременной работы до 8 рабочих групп (блоки в CUDA) каждый .При больших размерах входных данных вы можете выбрать запуск тысяч рабочих групп, и ваш конкретный графический процессор может обрабатывать до 65535 x 65535 рабочих групп за запуск ядра.

У OpenCL есть другой атрибут устройства CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE.Если вы запросите это на устройстве NVIDIA, оно вернет 32 (это «деформация», или естественная ширина SIMD оборудования).Это значение является кратным размеру рабочей группы, который вы должны использовать;Размеры рабочих групп могут составлять до 512 элементов каждый, в зависимости от ресурсов, потребляемых каждым рабочим элементом.Стандартное эмпирическое правило для вашего конкретного графического процессора заключается в том, что вам требуется не менее 192 активных рабочих элементов на вычислительную единицу (потоков на многопроцессорное в терминах CUDA), чтобы покрыть всю задержку архитектуры и потенциально получить либо полную пропускную способность памяти, либо полную арифметическую пропускную способность, в зависимости ото характере вашего кода.

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

2 голосов
/ 11 июля 2012

Я даже не думаю, что сопоставление количества рабочих групп с вычисляемыми единицами является хорошей идеей для процессора.Лучше переподписать ядра в несколько раз.Это позволяет рабочей нагрузке динамически перемещаться (в квантах рабочей группы), когда различные процессоры включаются или отвлекаются на другую работу.Рабочая группа count = CL_DEVICE_MAX_COMPUTE_UNITS действительно хорошо работает только на машине, которая больше ничего не делает и тратит много энергии, сохраняя неиспользуемые ядра активными

...