Настройка оптимального числа потоков DirectCompute

Недавно я играл с вычислительными шейдерами и пытаюсь определить наиболее оптимальный способ настройки [numthreads(x,y,z)] и диспетчеризации вызовов. Мое демонстрационное окно 800x600 и я запускаю 1 поток на пиксель. Я выполняю модификации 2D-текстуры — ничего сложного.

Моя первая попытка состояла в том, чтобы указать

[numthreads(32,32,1)]

Мои вызовы Dispatch() всегда

Dispatch(ceil(screenWidth/numThreads.x),ceil(screenHeight/numThreads.y),1)

Итак, для первого случая это было бы

Dispatch(25,19,1)

Это работало со скоростью 25-26 кадров в секунду. Затем я сократил до [numthreads(4,4,1)] со скоростью 16 кадров в секунду. Увеличение этого значения до [numthreads(16,16,1)] начало давать хорошие результаты около 30 кадров в секунду. Играя с номером группы потоков Y [numthreads(16,8,1)], удалось увеличить его до 32 кадров в секунду.

Мой вопрос: есть ли оптимальный способ определить номер потока, чтобы я мог наиболее эффективно использовать графический процессор, или это просто старые добрые пробы и ошибки?


person Valentin    schedule 24.10.2013    source источник


Ответы (2)


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

Я знаю, что вы используете DirectCompute, но они сопоставляются с одним и тем же базовым оборудованием. Если вы посмотрите на вывод FXC, вы увидите размер общей памяти и регистров для каждого потока в сборке. Также вы можете определить вычислительные возможности вашей карты. Вычислительные возможности — это CUDA-эквивалент таких профилей, как cs_4_0, cs_4_1, cs_5_0 и т. д.

Цель состоит в том, чтобы увеличить «занятость», или, другими словами, занятость == 100% - % простоя из-за накладных расходов на оборудование.

person Lucas    schedule 24.10.2013
comment
Какие параметры компиляции мне нужно установить, чтобы получить вывод сборки FXC? Я попробовал /Fc, но ничего в выведенном файле не дает мне описанной вами информации. Я использую msdn.microsoft .com/en-us/library/windows/desktop/ для справки. - person Valentin; 24.10.2013
comment
Я просто скомпилирую его только с профилем (/T), вы можете увидеть ассемблерный код. dcl_temps сообщает вам количество регистров, а операторы dcl_tgsm_* сообщают вам размер разделяемой памяти. - person Lucas; 25.10.2013

Профилирование — единственный способ гарантировать максимальную производительность на конкретном оборудовании. Но, как правило, до тех пор, пока вы поддерживаете небольшое количество активных регистров (16 или меньше) и не используете тонну разделяемой памяти, группы потоков ровно из 256 потоков должны быть в состоянии насытить большую часть вычислительного оборудования (при условии, что вы повторная отправка по крайней мере 8 или около того групп).

person MooseBoys    schedule 24.10.2013