2

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

给定一个具有 40 个着色器/流处理器的 GPU,并使用参考书作弊,我可以将百万项分解为 40 个 250,000 个条带的块,并为每个着色器设置两个起始值:

单位 0:1,1(然后计算 2,3,5,8,blah blah blah)

单元 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 一起工作。

链接或示例表示赞赏。

更新/简化

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

4

1 回答 1

2

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

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

顺便说一句,多次通过并不像您想象的那么慢,但它们对您的情况没有帮助。在不知道之前的值的情况下,您无法真正计算出任何下一个值,从而扼杀了任何并行化。

于 2010-12-01T16:22:58.523 回答