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

标签 c# xna hlsl gpgpu

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

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

unit 0: 1,1 (which then calculates 2,3,5,8,blah blah blah)

unit 1: 250,000th term

unit 2: 500,000th term

...

如果可能的话,我如何才能确保按顺序处理像素?如果输入纹理中的前几个像素具有值(为简单起见,使用 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 一起工作。

感谢链接或示例。

更新/简化

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

最佳答案

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

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

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

关于c# - HLSL 计算 - 按顺序处理像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4326255/

相关文章:

c# - 使用用户名/密码验证与 activeMQ 的连接

geometry - 如何在 GLSL/HLSL 中实现 SLERP

glsl - 如何确定性地检测着色器片段在其 2x2 像素四边形中的位置?

c# - 单个对象的 Monogame XNA 变换矩阵?

c# - 如何在 XNA 中永久删除敌方 Sprite

graphics - HLSL:在像素着色器中获取纹理尺寸

c# - 每次项目运行时,带有主菜单的窗体都会缩小

c# - 无法使用 DateTime 执行 INSERT INTO 以在 MS Access 中保存时间戳

c# - 单击按钮禁用回发