首先,似乎无法实现动态数组。因此,创建最大大小的数组并只填充其中一部分或定义具有预定义大小的数组会更好吗? br />使用展开循环或动态循环进行4到128次迭代是否更好?
我还看到可以将其展开到最大预定义的迭代次数,然后使用条件,例如
if (i == myCurrentMaximumIterationNumber)
。#1 楼
Shader编译器在展开时极具侵略性,因为早期的硬件通常没有流控制,而较新的硬件的成本可能会有所不同。如果您有正在积极测试的基准测试以及一系列相关的硬件,请尝试尝试一下以了解会发生什么。动态循环比静态循环更适合开发人员干预-但是除非有基准可用,否则将其留给编译器仍然是一个好建议。有了基准,探索是值得的(而且很有趣)。BTW,GPU上的动态循环的最大损失是波前/翘曲中的各个“线程”将在不同的时间结束。稍后停止的线程将强制所有提前完成的线程执行NOP。
嵌套循环应该仔细考虑:我实现了一个基于块的熵解码器,该编码器对零的行程进行编码(用于JPEG之类的压缩)。自然的实现是在一个紧密的内部循环中对运行进行解码-这意味着通常只有一个线程在进步。通过展平循环并在每个线程中显式测试当前是否正在解码运行,我通过固定长度循环(解码的块大小均相同)使所有线程保持活动状态。如果线程像CPU线程一样,更改将是非常糟糕的,但是在我运行的GPU上,我的性能提高了6倍(这仍然很糟糕-没有足够的块来保持GPU繁忙-但这是概念的证明。)
评论
您想对数组和循环做什么?我问是因为这听起来有点像XY问题。由于在GPU上使用条件和循环的最佳方法是避免使用它们,因此也许还有更好的方法来代替在您的情况下使用数组和循环。我正在实现当前有效的屏幕空间次表面散射效果。但是我对根据性能使用内核的方式有些怀疑。我选择最大数组大小并仅填充一部分,并使用具有动态迭代次数的动态循环,该循环与当前使用的数组内容有关。我认为例如根据性能对着色器进行编程时,有些事情要做或知道。在我看来,循环是一个常见的性能主题,可能遵循一些规则,甚至遵循“良好实践”,但我没有找到任何好的答案。