Вычисление максимального количества одновременных рабочих групп

Мне было интересно, есть ли стандартный способ программно определить максимальное количество одновременных рабочих групп, которые могут работать на графическом процессоре.

Например, на карте NVIDIA с 5 вычислительными блоками (или SM) может быть максимум 8 рабочих групп (или блоков) на каждый вычислительный блок, поэтому максимальное количество рабочих групп, которые могут выполняться одновременно, равно 40.

Поскольку я могу найти количество вычислительных единиц с помощью clGetDeviceInfo, все, что мне нужно, — это максимальное количество рабочих групп, которые можно запустить на вычислительной единице.

Спасибо!


person KLee1    schedule 22.03.2012    source источник


Ответы (2)


Максимальное количество групп на исполнительный блок/SM ограничено аппаратными ресурсами. Позвольте мне взять пример графического процессора Intel Gen8. Он содержит 16 барьерных регистров на каждый субсрез. Таким образом, одновременно может работать не более 16 рабочих групп.

Кроме того, объем общей локальной памяти, доступной для каждого подфрагмента (64 КБ). Если, например, рабочей группе требуется 32 КБ общей локальной памяти, только 2 из этих рабочих групп могут работать одновременно, независимо от размера рабочей группы.

person Manish Kumar    schedule 11.08.2015

Обычно я использую количество вычислительных единиц в качестве количества рабочих групп. Мне нравится увеличивать размер групп, чтобы насытить аппаратное обеспечение, а не заставлять GPU планировать множество рабочих групп «одновременно».

Я не знаю способа определить максимальное количество групп, не просматривая его в спецификациях поставщика.

person mfa    schedule 22.03.2012
comment
Я не смог найти максимальное количество рабочих групп ни в одной документации поставщика (AMD, Intel), я не думаю, что есть что-то вроде максимального количества рабочих групп, количество рабочих групп ограничено только количеством рабочих элементов, поэтому, если у вас рабочие элементы 1024, то 1024/CL_DEVICE_MAX_WORK_GROUP_SIZE не определяет рабочих групп. - person kiranputtur; 23.03.2012
comment
Это не совсем так. Когда вы используете clEnqueueNDRangeKernel, вы указываете параметр local_work_size. Это размер рабочей группы (и размеры). Вы также указываете global_work_size, который является глобальным размером и измерениями. Предполагая одномерную компоновку Количество рабочих групп равно global_work_size/local_work_size. Первоначальный вопрос заключался в том, как узнать предел одновременных рабочих групп «в полете» на графическом процессоре. Теоретически такого ограничения может и не быть, но на практике подкачка кеша и регистров резко влияет на производительность после некоторого количества групп. В какой-то другой момент это невозможно. - person mfa; 23.03.2012
comment
Если вы воспользуетесь этим методом, это не даст вам гарантии на полную занятость на устройстве. Также не хотелось бы ограничивать количество рабочих групп, которые можно запускать с хоста. - person KLee1; 24.03.2012
comment
@ocluser Это не гарантирует работу. Некоторые карты NVIDIA (архитектуры Fermi) допускают максимум 1024 рабочих элемента на рабочую группу, но позволяют выполнять 1536 потоков на вычислительном блоке. Следовательно, если у меня 512, то ваш метод даст 2 рабочие группы на вычислительную единицу, хотя на самом деле их 3. - person KLee1; 24.03.2012