CrossTL: Hub-Based Translation of GPU Programs and the Preservation of Source Rules
本文介绍了 CrossTL,这是一个基于枢纽的开源转换器,它通过携带规则的中间语言(CrossGL)将十种 GPU 语言路由至十一类目标语言,证明了显式保留特定于源语言的语义规则与仅基于语法的方案相比,能显著减少翻译差异,尽管由于底层实现的不一致性,它无法完全保证正确性,且在大规模第三方代码上的可用性提升也较为有限。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
现代视频游戏、科学模拟和人工智能都依赖于一种运行在图形处理器上的特殊计算机程序。这些芯片在同时进行大量计算方面速度极快,但它们对处理数字的方式非常挑剔。制造这些芯片的不同公司——例如苹果(Apple)、英伟达(NVIDIA)和超威半导体(AMD)——使用不同的语言来编写这些程序。虽然这些语言在表面上看起来很相似,但在最基本的算术规则上经常存在分歧。例如,一种语言可能规定,当一个数字加自身的结果过大时,应该回绕(wrap around)为一个小的负数;而另一种语言可能规定,这种行为是未定义的,结果可能是任何数值。如果开发者为一种类型的芯片编写了程序,并试图将其移动到另一种芯片上,翻译工具必须决定遵循哪种规则。如果他们判断错误,程序可能会编译并运行,但会产生错误的答案,从而可能导致游戏崩溃或损坏科学数据。
一组研究人员致力于解决这一问题,他们着手构建一个用于这些图形程序的通用翻译器。他们创建了一个名为 CrossTL 的系统,该系统充当一个中央枢纽。该系统并非为每一对可能的语言构建单独的翻译器,而是将来自十种不同源语言的代码转换为一种单一的中性格式,然后再发送到十一种不同的目标语言中。他们面临的核心挑战在于,这种中性格式本身并不会记住某段代码原本应该遵循哪种特定的规则。它能看到一个简单的加号,但无法分辨这个符号意味着“回绕”还是“停止并报错”。由于缺乏这种记忆,翻译器可能会意外地改变程序的含义,导致“静默失败”,即代码可以运行,但计算结果却是错误的。
为了解决这个问题,研究人员开发了一种称为“规则携带”(rule carrying)的方法。他们修改了翻译器,使其在遇到每一个数学运算时都会附带一个特定的注释。这个注释记录了原始语言对该运算所使用的确切规则。当代码通过枢纽并流向新的目标语言时,翻译器会检查这个注释。如果目标语言遵循相同的规则,它就会直接传递该运算。如果目标语言遵循不同的规则,翻译器就会用一段定制的自定义代码替换该运算,从而强制目标语言的行为与源语言完全一致。这确保了无论底层语言有何差异,程序在新硬件上的计算结果都与旧硬件上保持一致。
团队使用一套经过精心设计的、包含六十六个测试程序(称为危险内核,hazard kernels)的套件对该系统进行了严格测试。这些测试旨在触发语言产生分歧的具体规则,例如在除以零或将过大的数字相加时会发生什么。他们在包括苹果图形处理器和若干开源驱动程序在内的多种现实世界硬件和软件环境中运行了这些测试。结果显示,如果没有他们的新方法,现有的翻译工具在许多情况下都会丢失正确的规则,从而导致输出错误。当研究人员启用规则携带功能时,系统在几乎所有情况下都成功保留了正确的行为。在数百次测试运行中,错误数量大幅下降,剩余的极少数失败案例被追溯到特定驱动程序处理代码时的特殊偏差,而非翻译逻辑本身的问题。
该研究还考察了这种新方法在成千上万个由第三方编写的真实世界程序(涵盖从机器学习库到图形引擎)上的表现。研究人员发现,虽然与某些成熟工具相比,新系统产生能被编译器接受的代码的可能性略低,但它在确保已编译代码能够“正确运行”方面要可靠得多。事实上,新方法对代码成功率的影响变化不到 1%,这证明了它可以在不破坏现有工作流程的情况下被采用。研究人员得出结论:对于一个真正的忠实翻译器而言,它不能仅仅是将语法从一种语言移动到另一种语言,它必须将源语言的语义规则也一并携带,以确保程序的含义在旅途中完好无损。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。