GCC 编译器可以使用 nVidia GPU 来加速编译 and/or 链接吗?
Can the GCC compiler use nVidia GPU to speed up compilation and/or linking?
我正在查看带有 nvptx 卸载的 gcc(特别是在 Windows/MinGW-w64 上),我想知道 gcc 本身是否可以利用这一点,所以它有更多的处理能力来更快 compiling/linking?
或者这个问题没有什么意义,因为这些过程在本质上不够数学化?
还有一个事实是 gcc 有一些本质上吃数学的依赖项(mpfr、gmp、mpc、isl),所以也许他们可以利用卸载来使 gcc 使用 GPU 更快?
“可以……吗?” : 不,不能;否则它会在手册中:-)
“可以……吗?”:可能不会;编译主要是遍历数据结构,不执行并行算术运算,并且除了在非常高的级别上之外,显然不是并行的。一次通过需要由前一次通过创建的状态,因此有严格的顺序并且您不能轻易地并行执行多个通过。 (每次通过都更新代码的单个表示)。
当前的方法是使用 make -j8
或类似的方法同时编译多个文件,但即使在那里你也不太可能有足够的并行度来保持 GPU 忙碌。
能用吗?是的。应该是?可能不是,但不是因为许多人所说的原因。
tl;dr:大多数工具链都使用陈旧过时的技术、数据结构和受非常老旧计算机限制设计的算法。
与许多声称编译和 linking 不可并行化的人相反,它们是可并行化的。通常,linking 实际上是过程中最慢的部分。链接和编译基本上没有在“作业服务器”实现之外并行化有两个主要原因。
其一,直到最近,大多数计算机都没有足够的内存或 CPU 线程来使这种技术变得有价值,任何有足够的钱来购买足够的 GPU 来执行此类任务的人都会收到只需购买多个 CPU 并进行分布式编译即可获得更好的投资回报率。
其次,虽然优化方面的新发明和其他技术如 link-time-optimizations(也在 link 时间进行编译和代码生成)改进了编译器的输出和 linker,大多数工具都是根据非常陈旧的想法、陈旧的代码设计的,并且承载着大量的内容和重量,由于不守规矩的代码库而阻碍了进步。
无论如何,使用 GPU 可能仍然不值得。较新的工具,如模具 linker,仅在 CPU 上就可以实现指数级的加速。 Mold 已经“重新实现”了尽可能多的基本 linking 任务,以利用现代并行功能和高内存可用性。它尚不支持 LTO,但它在 linking 期间实现了接近文件复制(最大 I/O 带宽)的速度。使用 implemental/cached 构建,Clang 和 Chrome 可以在 32 核线程撕裂处理器上 link 在不到一秒的时间内完成,相比之下,在 GNU 的 gold linker 上大约需要 60 秒,或在同一处理器上使用 lld 10 秒。
如果您愿意,可以在这里了解更多关于霉菌的信息:
https://github.com/rui314/mold
我正在查看带有 nvptx 卸载的 gcc(特别是在 Windows/MinGW-w64 上),我想知道 gcc 本身是否可以利用这一点,所以它有更多的处理能力来更快 compiling/linking?
或者这个问题没有什么意义,因为这些过程在本质上不够数学化?
还有一个事实是 gcc 有一些本质上吃数学的依赖项(mpfr、gmp、mpc、isl),所以也许他们可以利用卸载来使 gcc 使用 GPU 更快?
“可以……吗?” : 不,不能;否则它会在手册中:-)
“可以……吗?”:可能不会;编译主要是遍历数据结构,不执行并行算术运算,并且除了在非常高的级别上之外,显然不是并行的。一次通过需要由前一次通过创建的状态,因此有严格的顺序并且您不能轻易地并行执行多个通过。 (每次通过都更新代码的单个表示)。
当前的方法是使用 make -j8
或类似的方法同时编译多个文件,但即使在那里你也不太可能有足够的并行度来保持 GPU 忙碌。
能用吗?是的。应该是?可能不是,但不是因为许多人所说的原因。
tl;dr:大多数工具链都使用陈旧过时的技术、数据结构和受非常老旧计算机限制设计的算法。
与许多声称编译和 linking 不可并行化的人相反,它们是可并行化的。通常,linking 实际上是过程中最慢的部分。链接和编译基本上没有在“作业服务器”实现之外并行化有两个主要原因。
其一,直到最近,大多数计算机都没有足够的内存或 CPU 线程来使这种技术变得有价值,任何有足够的钱来购买足够的 GPU 来执行此类任务的人都会收到只需购买多个 CPU 并进行分布式编译即可获得更好的投资回报率。
其次,虽然优化方面的新发明和其他技术如 link-time-optimizations(也在 link 时间进行编译和代码生成)改进了编译器的输出和 linker,大多数工具都是根据非常陈旧的想法、陈旧的代码设计的,并且承载着大量的内容和重量,由于不守规矩的代码库而阻碍了进步。
无论如何,使用 GPU 可能仍然不值得。较新的工具,如模具 linker,仅在 CPU 上就可以实现指数级的加速。 Mold 已经“重新实现”了尽可能多的基本 linking 任务,以利用现代并行功能和高内存可用性。它尚不支持 LTO,但它在 linking 期间实现了接近文件复制(最大 I/O 带宽)的速度。使用 implemental/cached 构建,Clang 和 Chrome 可以在 32 核线程撕裂处理器上 link 在不到一秒的时间内完成,相比之下,在 GNU 的 gold linker 上大约需要 60 秒,或在同一处理器上使用 lld 10 秒。
如果您愿意,可以在这里了解更多关于霉菌的信息: https://github.com/rui314/mold