2013-10-24 3 views
4

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

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

[numthreads(32,32,1)] 

My 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 кадров в секунду.

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

ответ

3

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

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

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

+0

Какие параметры компиляции я должен установить для того, чтобы получить выход сборки FXC? Я попробовал/Fc, но ничего в выведенном файле не дает мне информацию, которую вы описали. Я использую http://msdn.microsoft.com/en-us/library/windows/desktop/bb509709(v=vs.85).aspx для справки. – Valentin

+1

Я просто скомпилирую его только с профилем (/ T), вы можете увидеть код сборки. dcl_temps сообщает вам, что счетчик регистров и операторы dcl_tgsm_ * сообщают вам размер общей памяти. – Lucas

2

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

Смежные вопросы