我想使用手工编码的汇编语言顶点和片段着色器,以便使用OpenGL ES 2.0在iPhone上编写非常优化的着色器。
我用Google搜索,但我找不到一个例子,即使苹果sdk允许这样做。
答案 0 :(得分:14)
在iPhone上,无法手动调整着色器。值得注意的是,特别是在iPhone上,没有优化可以做到编译器无法做到的。也就是说,GLSL编译器可能会击败或匹配您手动调整的组件。
然而,在PC上,我个人并不相信驱动程序知道循环着色器应该使用更少的寄存器和更多指令,以便通过更高的占用率实现更高的吞吐量。司机根本没有足够的背景来做出正确的选择。特定于数据的编译时优化就是这个问题的一个很好的例子。
作为实际查看过GLSL编译器程序集输出并尝试使用编译器的寄存器分配策略的人,我可以告诉你,没有组装访问绝对会损害性能(在PC上) ,有一些来自NVidia和AMD的公开工具允许你这样做)。使用组件的权衡是每个着色器都需要针对每个支持的部件进行手动调整,以实现最大可能的性能。虽然这有点极端,但如果我想投入自己的时间来精细调整我的产品支持的每个视频卡的渲染后端,那么我应该能够这样做。一个更实际的例子是低端视频卡的手动调整,但让GLSL编译器在更高端的视频卡上做它的工作。
此外,离线编译器提供了一种安全机制。今天许多视频游戏都依赖于驱动程序来模拟现代图形API中的许多功能。作为一个在PC上的游戏即服务领域工作的游戏开发人员,我可以告诉你,由于GLSL中存在轻微的GLSL错误,在半夜接听电话非常令人沮丧。新发布的图形驱动程序驱动程序错误严重影响整体玩家体验。大多数玩家只是认为你的游戏被打破了,结果你实际上可能会失去玩家(我们可能已经失败了)。能够为每个支持的视频卡编译一次并在事后进行手动调整将是这方面的巨大胜利。它只是意味着司机必须做更少的工作。代码是邪恶的,因此执行的代码越少越好=)。
作为旁注,我使用'编译' - '查看程序集' - '修改' - '重复&#39进行了以下演示;方法:http://www.youtube.com/watch?v=km0DpZUgvbg。我可以100%肯定地告诉你,我可以用汇编语言进一步提高这种射线追踪器的性能,而AFAIK,它是已经发布的最快的体素射线追踪器(就是这样的情况) 2012年3月,但可能不再是真的)。不出所料,每当一个新的驱动程序出现时,我会看到这个演示的性能从125-130 fps下降到30 fps - 所有这些都是因为驱动程序不知道如何正确优化我的着色器。这意味着每次新驱动程序出现时我都必须重复我的优化过程,这导致我只是将项目暂停(确认!)。即使我的体素光线跟踪器能够以高性能方式支持各种硬件,但驱动程序目前无法在完整产品中支持此技术。我只是没有把这项技术付诸实践的重要性,因为它需要驱动程序供应商知道他们需要优化我的着色器的方式。如果我们只是直接进行装配着色器访问,那么有多少其他技术是可能的?这意味着缺乏组装访问实际上是一个严重的成本。对于这个职位的其他人,我建议如下:尽可能使用NVidia的汇编语言,如果不是,则回退到GLSL。如果我们展示组装优于GLSL的优势,那么希望我们能够获得所有供应商的一流装配支持=)。
最后,不要选择另一位作者,但我想指出“尼古拉·博拉斯”所提出的论点。几乎完全是错误的(对不起尼科尔,我没有反对你,但我想指出一些流行的论点,这些论点根本不符合道德测试)。请注意,一个错误的论点并不意味着一个特定的结论是错误的 - 只是所提出的论点只是谬误。
"为什么呢?你不相信编译器做它的工作?您是否真的认为您对GPU有足够的了解能够始终如一地击败编译器?"
"最终,你只需要相信构建GPU的人所做的编译器。这些天没有其他人有问题。"
尼科尔,你的两个谬论都暗示你是正确和正常的,任何不同意你的人都是错的,并且有些不对劲。这些是非常不健康的观点,你应该严格检查它们是否适合你自己的心理健康和事业。
供将来参考:http://en.wikipedia.org/wiki/List_of_fallacies#Formal_fallacies
谢谢!
答案 1 :(得分:3)
我想使用手工编码的汇编语言顶点和片段着色器,以便使用opengl es 2.0在iphone上编写非常优化的着色器。
为什么呢?你不相信编译器做它的工作?你真的认为你对GPU有足够的了解能够始终如一地击败编译器吗?
无论如何,你不能。你也不能在桌面OpenGL中做到这一点。 ARB组装着色器与GLSL的关系并不那么接近硬件;它们都通过内部编译器进行编译和优化。
最终,你只需要相信构建GPU的人所做的编译器。这些天没有其他人有这个问题。
答案 2 :(得分:2)
我理解你指出的很好:你想看到生成的汇编源代码,并且可能会修改它。
事实上,与HLSL编译器相比,GLSL编译器没有进行优化。为了说服自己,只需将ShaderAnalyzer中生成的程序集与GLSL和HLSL中的相同着色器进行比较;你会立即看到他们根本没有提供相同的优化。
即使是微不足道的优化,例如分解if()条件,大多数GLSL编译器都不能完成这项工作。
我真的很想看到Apple编译器生成的ASM(尤其是iOS平台)。如果你知道一种获得装配的方法,我对这个过程非常感兴趣。