Потоки на GPU

Я использую DirectCompute для общих вычислений на GPU. В настоящее время я пытаюсь работать с текстурой с разрешением 1920x1080. У меня есть Dispatch(2, 1080, 1) и numthreads(960, 1, 1), которые по моим расчетам точно покрывают мое изображение с одним потоком на пиксель.

Теперь, как я понимаю, все потоки должны запускаться одновременно, верно? Однако в моем коде я не выполняю никаких вычислений, если пиксель черный. Поэтому я заметил определенное увеличение производительности, когда большая часть моего изображения черная. Однако, если один объект загораживает экран, производительность резко падает.

Мой вопрос: если все потоки работают параллельно, скорость обработки кадра будет определяться наименее производительным потоком, по сути, потоки, работающие с черными пикселями, будут бездействовать, верно? Так почему же тогда я вижу замедление при обработке большего количества пикселей? Они должны делать это одновременно. Или я все неправильно понял?

Любая помощь будет оценена по достоинству.


person l3utterfly    schedule 25.10.2012    source источник


Ответы (2)


Не все потоки выполняются одновременно. Точные цифры, вероятно, немного изменились, но несколько лет назад высокопроизводительный ЦП мог одновременно поддерживать 16 тысяч потоков, но «только» несколько сотен из них фактически выполнялись одновременно. (Затем он подразделяется на меньшие подгруппы, и каждый поток в такой подгруппе выполняется строго синхронно, инструкция за инструкцией, ветвь за ветвью). Остальные были приостановлены, ожидая ввода-вывода, или иным образом заблокированы.

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

Да, многопоточность на GPU сложна.

person jalf    schedule 25.10.2012
comment
Я думаю, это объясняет многое, о чем я думал. Спасибо за Ваш ответ. Мне нужно будет немного больше узнать о многопоточности графического процессора в Интернете. - person l3utterfly; 26.10.2012

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

И как выглядит ваш алгоритм?

person Tordin    schedule 25.10.2012
comment
Ну, я делаю двойную буферизацию, поэтому я всегда показываю одно изображение и одновременно выполняю вычисления для следующего. Однако я думаю, что проблема заключается в том, что мой алгоритм слишком медленный. Но то, что сказал Джалф, очень поучительно. Мой алгоритм? Я изучаю область трассировки лучей в реальном времени и только что написал алгоритм грубой силы, чтобы проверить возможности моего графического процессора. Очевидно, что потребуется тонна оптимизаций. - person l3utterfly; 26.10.2012