Количество вычислительных единиц, соответствующих количеству рабочих групп

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

Также указан чип с 16 ядрами cuda (которые соответствуют PE, которые, как я полагаю). Означает ли это, что теоретически наиболее эффективная настройка для этого gpu, касающаяся глобальной полосы пропускания памяти, состоит в том, чтобы иметь две рабочие группы с 16 рабочими элементами каждый?

Ответ 1

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

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

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

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

Ответ 2

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