不同的CG/GLSL/HLSL函数的性能表现

8

有一些标准的着色器函数库,比如Cg。但是是否有资源告诉你每个函数需要多长时间...我想类似于以前可以查看每个汇编操作需要多少周期。


2
它因设备而异。 - Flexo
我猜,现在更重要的是你能装载多少处理器。如果你设置了一个依赖纹理读取的重型着色器,你会遇到停顿、等待和其他不愉快的事情。在这种情况下,纯粹的“周期计数”是没有帮助的。 - Lyth
两者都是正确的 - 但一些想法仍然有用作为起点。例如数学/几何函数...除法与cos相比如何,cos与acos相比如何,sqrt与tan相比如何... - Mr. Boy
@John 我猜它们大体上是相同的循环,但我不能说它们与简单的MUL和ADD相比表现如何。但我知道的是,至少在NVDIA的架构中,多处理器对于超越函数(如sin、sqrt等)的ALU数量比简单的MUL/ADD-ALU少(可能是8:1或4:1),因此它们可以并行执行更多的MUL/ADD而不是SIN/SQRT。除此之外,你可能需要问个别GPU开发者。 - Christian Rau
1个回答

14

没有任何可靠的资源可以告诉你各种标准着色器函数需要多长时间才能完成,即使是在特定硬件上也不行。

这是由于指令调度和现代着色器架构的工作方式。以简单的sin函数为例,假设硬件有一个特殊的硬件来计算值的正弦函数,因此它不会手动使用泰勒级数等方法。但是,我们还可以说,实际计算需要一系列4个操作码。因此,sin需要“4个周期”才能完成。

然而,所有这些操作码都是标量操作。因此,当它们正在进行时,您实际上可以在同一处理器上同时进行一些3向量点积,或者在某些硬件的情况下,进行一些4向量点积,相同时间内。因此,如果硬件具有带标量运算的4维向量点积,则执行sin和矩阵-向量乘法所需的周期数仍然是4个。

那么sin操作的代价是多少呢?如果您将矩阵乘法删除,没有任何变快。如果您拿掉sin,仍然没有任何变快。它的成本是多少?您无法说出单个操作的成本是多少,因为单个操作的成本是不相关的。唯一可衡量的数量是着色器本身的成本。

最终,您可以尝试合理地构建您的着色器,并查看其性能。除非您拥有低级调试工具来去编译底层着色器程序(不,DX汇编不够好),否则这是您能做的最好的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接