2010-12-01 3 views
2

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

Учитывая GPU с процессорами 40 шейдеров/потока и обманом, используя справочник, я могу сломать до миллиона терминов на 40 блоки 250000 полос, и семена каждого шейдера с двумя значениями старта:

блока 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-й срок до первых четырех готовы?

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

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

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

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

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

ответ

2

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

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

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

+0

Я не пытаюсь запустить шейдеры в серии; это было бы глупо. Я думал, что разбив его на полоски (один большой кусок на шейдер), они все равно могут работать параллельно, но, похоже, уровень контроля невозможен. Итак, чтобы быть понятным, невозможно написать шейдер, который использует значения из одного пикселя для вычисления значения для другого пикселя? – 2010-12-01 16:28:53

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