Хотя установка количества рабочих групп равной 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 отображает функции их аппаратного обеспечения, и он ответит на вопросы, которые вы подняли здесь.