HLSL计算 - 按顺序处理像素?

时间:2010-12-01 15:59:59

标签: c# xna hlsl gpgpu

想象一下,我想要使用GPU计算Fibonacci序列的前一百万个项。 (我意识到这将超过32位数据类型的精度限制 - 仅用作示例)

鉴于拥有40个着色器/流处理器的GPU以及使用参考书作弊,我可以将百万个术语分解为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
...

如何确保在前四个准备好之前我没有尝试计算第五个学期?

我意识到这可以在多次传递中完成,但是无论何时计算一个值都会设置一个“就绪”位,但这似乎非常低效,并且消除了在GPU上执行此类计算的好处。

OpenCL / CUDA / etc可能提供了很好的方法来实现这一点,但我正在尝试(为了我自己的启发)让它与XNA / HLSL一起使用。

赞赏链接或示例。

更新/简化

是否可以编写一个着色器,该着色器使用一个像素的值来影响相邻像素的值?

1 个答案:

答案 0 :(得分:2)

您无法确定像素的处理顺序。如果可以,那将破坏着色器管道的大量像素吞吐量。你可以做的是使用非递归公式计算Fibonacci序列。

在您的问题中,您实际上是在尝试将着色器单元序列化为一个接一个地运行。您可以立即使用CPU,速度会快得多。

顺便说一下,多次通过并不像你想象的那么慢,但在你的情况下它们不会帮助你。如果不知道以前的值,就无法真正计算任何下一个值,从而导致任何并行化。