Ответ 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 сопоставляет функции своего оборудования, и ответит на ваши вопросы.