我正在开发 cuda 代码。但是宣布了 PTX 或 SPIR 后端的新设备语言。我可以遇到一些他们正在开发的应用程序。至少我认为我们可以说 ptx 语言足以在产品级别开发一些东西。
众所周知,PTX 不是真正的设备代码。它只是 NVidia 的中间语言。但我的问题是如果我开发 PTX 而不是 CUDA 会怎样?如果我使用 ptx,我可以开发自然优化的代码吗?有意义吗?
另一方面,为什么/什么是 PTX 语言的动机?
提前致谢
我正在开发 cuda 代码。但是宣布了 PTX 或 SPIR 后端的新设备语言。我可以遇到一些他们正在开发的应用程序。至少我认为我们可以说 ptx 语言足以在产品级别开发一些东西。
众所周知,PTX 不是真正的设备代码。它只是 NVidia 的中间语言。但我的问题是如果我开发 PTX 而不是 CUDA 会怎样?如果我使用 ptx,我可以开发自然优化的代码吗?有意义吗?
另一方面,为什么/什么是 PTX 语言的动机?
提前致谢
是的,在 PTX 中实现 CUDA 代码是有意义的,就像在汇编而不是 C++ 中实现常规 CPU 代码是有意义的一样。
例如,在 CUDA C 中,没有有效的方法来捕获进位标志并将其包含在新的计算中。因此,很难实现使用比机器本机支持的更多位的高效数学运算(在所有当前 GPU 上都是 32 位)。使用 PTX,您可以高效地实施此类操作。
我在 CUDA C 和 PTX 中都实施了一个项目,并看到 PTX 的显着加速。当然,只有当您的 PTX 代码优于编译器从纯 CUDA C 创建的代码时,您才会看到加速。
我建议首先创建一个 CUDA C 版本以供参考。然后创建参考的副本并开始用 PTX 替换其中的一部分,由分析结果确定,同时确保结果与参考的匹配。
就 PTX 的动机而言,它提供了一种抽象,让 NVIDIA 在不破坏向后兼容性的情况下,可以在几代 GPU 之间更改本机机器语言。
在 PTX 中开发的主要优点是它可以让您访问某些未在 CUDA C 中直接公开的功能。例如,加载指令上的某些缓存修饰符、一些打包的 SIMD 操作和谓词。
也就是说,我不会建议任何人在 PTX 中编码。在 CUDA 库团队中,我们有时通过内联汇编将 PTX 例程包装在 C 函数中,然后使用它。但是用 C/C++/Fortan 编程比编写 PTX 容易得多。
此外,运行时会将您的 PTX 重新编译为内部特定于硬件的汇编语言。在此过程中,它可以重新排序指令、分配寄存器和更改调度。因此,您在 PTX 中的所有仔细排序大多是不必要的,并且通常与最终的汇编代码无关。NVIDIA 现在在 disassembler 上发布,它可以让您查看实际的内部组装 - 如果您想玩它,您可以自己比较。