Вычисление HLSL - обработка пикселей в порядке - PullRequest
2 голосов
/ 01 декабря 2010

Представьте, что я хочу, скажем, вычислить первый миллион слагаемых последовательности Фибоначчи, используя графический процессор. (я понимаю, что это превысит предел точности для 32-битного типа данных - используется только в качестве примера)

При наличии графического процессора с 40 шейдерами / потоковыми процессорами и мошенничества с использованиемВ справочнике я могу разбить миллион терминов на 40 блоков по 250 000 полос и заполнить каждый шейдер двумя начальными значениями:

единица 0: 1,1 (которая затем вычисляет 2,3,5,8, бла-бла-бла)

единица 1: 250 000-й член

единица 2: 500 000-й срок

...

Как, если возможно, я могу обеспечить, чтобы пиксели обрабатывались по порядку?Если первые несколько пикселей во входной текстуре имеют значения (для простоты с RGBA)

0,0,0,1 // initial condition
0,0,0,1 // initial condition
0,0,0,2
0,0,0,3
0,0,0,5
...

Как я могу убедиться, что я не пытаюсь вычислить 5-й член до того, как первые четыре будут готовы?

Я понимаю, что это может быть сделано за несколько проходов, но установка бита «готово» всякий раз, когда вычисляется значение, но это кажется невероятно неэффективным и как бы исключает преимущество выполнения этого типа вычислений на GPU.

OpenCL / CUDA / etc, вероятно, предоставляют хорошие способы сделать это, но я пытаюсь (для моего собственного назидания) заставить это работать с XNA / HLSL.

Ссылки или примеры приветствуются.

Обновление / упрощение

Можно ли написать шейдер, который использует значения из одного пикселя для воздействия на значения из соседнего пикселя?

1 Ответ

2 голосов
/ 01 декабря 2010

Вы не можете определить порядок обработки пикселей. Если бы вы могли, это нарушило бы огромную пиксельную пропускную способность шейдерных конвейеров. Что вы можете сделать, так это вычислить последовательность Фибоначчи, используя нерекурсивную формулу.

В вашем вопросе вы на самом деле пытаетесь сериализовать шейдерные модули для запуска один за другим. Вы можете использовать процессор сразу, и он будет намного быстрее.

Кстати, несколько проходов не так медленны, как вы думаете, но они не помогут вам в вашем случае. Вы не можете реально вычислить любое следующее значение, не зная предыдущих, тем самым уничтожая любое распараллеливание.

...