2015-03-07 2 views
0

OpenGL фрагмент шейдера: сколько разницы в времени вычислений между работой «4 раза по 1 каналу» против «1 раз 4 канала»?Шиндер фрагментов OpenGL: сколько разницы в времени вычислений между работой «4 раза по 1 каналу» и «1 раз 4 канала»?

Например, я мог делать вычисления по 1 канал каждый раз, и я делаю 4 раза.

Или я мог бы поместить всю дату в 4 канала и сделать это 1 раз.

Некоторые вещи, чтобы рассмотреть следующие вопросы: (а) некоторые перегрузки один фрагмент шейдеров нагрузки, (б) время выборки текстур из 1 канала практически равна выборки текстур 4 канала? По сравнению с одним умножением в шейдере, сколько времени текстуры fetech? Если время текстуры fetech не много, и есть много шагов вычисления (включая много умножений, добавление и т. Д.), Тогда нам не нужно много времени уделять текстуре fetech.

(с), сколько разница в времени вычисления 4 раза флоат а * плыви и 1 раз из vec4 (а, а, а, а) * vec4 (а, а, а, а)?

Я точно знаю, что «1 раз 4 канала» быстрее, чем «4 раза по 1 каналу» Но я хочу знать, как это быстрее.

Причина, по которой я рассматриваю «4 раза 1 канал», потому что вся реализация включает в себя несколько проходов. Например, ввод текстуры 1, рендеринга в текстуру 2. Это означает, что есть две текстуры, существующие одновременно. После вычисления текстуры 2 мы можем удалить текстуру 1. Поэтому нам нужна одна дополнительная текстура для памяти GPU. Для 1 канала это означает одну дополнительную текстуру 1-го канала для памяти GPU. Для 4-х каналов это означает дополнительную текстуру 4-х каналов для памяти GPU. Таким образом, это приводит к разнице в пространстве. (Это простой пример. Реальная реализация должна включать в себя больше шагов)

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

Любая идея или ресурс по этим вопросам?

+0

_ "Я знаю, что„1 раз из 4-х каналов“быстрее, чем„4 раза по 1 каналу“Но я хочу чтобы узнать, как это быстрее ». Я хотел бы добавить, что вы можете использовать [сборку текстур] (https://www.opengl.org/sdk/docs/man/html/textureGather.xhtml), чтобы получить 4 сингла -канальные тексели (соседи, используемые для линейной фильтрации текстур) с таким же объемом работы, как 1 четырехканальный тексель. Можете ли вы использовать это в своих интересах, но я не могу сказать, - но для такого подхода на аппаратном уровне DX11 есть некоторые допустимые применения. –

+0

D3D [Справочник по языку HLSL] (https://msdn.microsoft.com/en-us/library/windows/desktop/hh447088%28v=vs.85%29.aspx) делает лучшую работу _much_, объясняющую, как работает эта функция если вас это интересует. –

ответ

0

Это не совсем верно и зависит от вашего прецедента. Если ваши входные данные чередуются, то есть нормальный RGBA, скорее всего, обработка 4-х каналов одновременно и использование только 1-го канала лучше. Если ваши данные чередуются и вы обрабатываете по одному каналу за раз, вы будете выполнять такой же объем вычислений, но в 4 раза больше стоимости доступа к памяти. Причина в том, что, хотя вы читаете только один канал, все 4 загружаются, а затем 3 из них отбрасываются. Если ваши данные разделены по каналам, т. Е. Массив всех значений R-канала, а затем массив всех значений G и т. Д., То обработка одного канала за раз лучше, и вы будете пропускать только 1 проход по вашим данным.

В конце концов, посмотрите, как организованы ваши данные и выполняются тесты и измерения.

+0

Помимо вывода texel, в шейдере фрагмента есть другие вычисления. Какая разница в времени вычисления 4-х раз float a * float a и 1 раз vec4 (a, a, a, a) * vec4 (a, a, a, a)? Если это почти в 4 раза, то «4 раза по 1 каналу» имеет только 3 фетха текселя. – user1914692

+0

Типичный графический процессор должен иметь специализированное оборудование для вычисления vec4 * vec4, как и SIMD на процессоре. – Ethan

0

Я думаю, что нашел отчасти ответ.

В терминах времени вычисления 1 раз флоат а * плавать и 1 раз из vec4 (а, а, а, а) * vec4 (а, а, а, а),

Поэтому нам нужно как можно больше использовать vec4.

Они должны быть такими же, в соответствии с «Chapter 35. GPU Program Optimization» от GPU Gems 2.