构建灵活的软件系统的一种有效方法是通过嵌入式脚本语言使其可扩展。TCL、Python和Lua等语言允许程序员编排和定制许多软件系统的行为,例如游戏(游戏邦注:游戏大部分是用c++编写的,但通常用Lua实现角色的AI和其他玩法机制),以及用Python代码编写的高性能计算应用程序,以协调c++或Fortran库代码的执行。
大多数嵌入式脚本语言都是解释的,因此不适合实现对性能至关重要的内部循环。此外,在许多关注性能的领域中,通过核心系统和嵌入式语言之间的接口传递的运行时开销太大了,尤其是在需要频繁转换的时候。因此,大多数面向性能的系统并没有在其性能关键部分的核心提供可编程性选项。
然而,在图形领域,可编程的高性能栅格化流水线在过去十年中一直是交互式渲染的核心。现代图形处理单元(gpu)的程序员为管道的内部循环提供代码,用基于c语言(如HLSL或GLSL)编写“着色器”。着色器编程模型是数据并行的;该模型提供了丰富的并行性,可以很好地映射到底层SIMD硬件体系结构。虽然可编程的gpu现在已经用于图形以外的许多领域,用于高性能计算,但是否有可能构建自己可编程的以gpu为目标的高性能软件系统仍然是一个悬而未决的问题。
下面的文章由Parker等人展示了如何在这样的系统中实现可编程性和高性能。他们的OptiX系统的领域是用于图像合成的交互式光线追踪。光线追踪是一种非常灵活的渲染方法,可以比栅格化更有效地模拟许多重要的灯光效果,但在OptiX之前,它在交互式图形中的应用一直受到限制,用户可以选择灵活性不够的高性能光线追踪系统,或高度灵活的光线追踪系统,但性能不足。
作者已经开发了经典光线跟踪算法的优雅表达,作为一个可编程数据流图组装从用户提供的代码在每个阶段。OptiX提供了在各个阶段之间运行的核心几何和并行工作调度算法的高度优化实现。就像GPU栅格化流水线一样,程序员可以在可编程性的关键点上完全控制系统的行为,而无需担心高性能GPU编程的细节。OptiX对用户提供的内核使用CUDA语言;CUDA提供了一种在gpu上高效运行的数据并行编程模型。
OptiX通过消除核心OptiX系统代码和用户提供的代码之间的障碍,在不牺牲性能的情况下实现了可编程性。它对两个代码集合都应用了专门的JIT编译器,不仅允许跨系统两个部分之间的边界内联,还允许不断传播和消除死代码,从而生成一个专门的系统版本。因此,OptiX核心系统可以提供最终可能不需要的功能;当将系统编译在一起时,将删除用于此类功能的代码。
这种系统实现方法允许OptiX的用户实现,例如,自定义的3D场景几何表示,以及自定义的算法,以模拟照明和反射,这两个关键领域的自定义光线跟踪。作者成功地设计出正确的问题分解方法的一个迹象是光线跟踪的广泛应用,不仅包括渲染,甚至包括音频模拟和碰撞检测,这些都是用OptiX实现的。由此产生的系统已经足够接近峰值效率,OptiX已经迅速成为大多数GPU光线追踪的标准基础。
在GPU上引入可编程栅格化流水线的一个意想不到的成功是,程序员在使用GPU栅格化流水线时表现出的创造力,其方式是最初的设计者从未想象过的。通过将灵活和高性能的光线追踪技术应用到比以前更多的开发人员的工具箱中,OptiX似乎很有可能以今天无法预测的方式激发创新。
对于那些想要编写可扩展的高性能软件系统的人来说,这篇文章是必读的。虽然这项工作的目标硬件架构是gpu,但其基本思想同样适用于cpu上的高性能软件系统。今天,随着像LLVM这样的高质量编译器工具包的可用性,以这种方式实现各种系统的门槛现在相当低,而潜在的优势是显著的。
©2013 0001 - 0782/13/05 ACM
如果您不是为了盈利或商业利益而制作或分发本作品的部分或全部,并在第一页注明本通知和完整引用,则允许您免费制作本作品的部分或全部数字或纸质副本,供个人或课堂使用。本作品的组成部分必须由ACM以外的其他人享有版权。信用文摘是允许的。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,需要事先获得特定的许可和/或费用。请求发布的权限permissions@acm.org或传真(212)869-0481。
数字图书馆是由计算机协会出版的。版权所有©2013 ACM有限公司
没有发现记录