是否有任何方法或工具来应用 GPU 加速编译程序与 GCC 编译器?现在我已经创建了一个程序来迭代地编译给定的程序列表。需要几分钟。我知道一些像 Pyrit 这样的程序,它可以帮助应用 GPU 加速进行预计算散列。
If there are no such tools available, Please advice on whether to use OpenCL or anything else to reprogram my code.
在命令式编程语言中,语句按顺序执行,每个语句都可能改变程序的状态。因此,分析翻译单元本质上是顺序的。
例如: 查看常量传播是如何工作的-
a = 5; b = a + 7; c = a + b + 9;
在确定分配给 b和 c的值在编译时是常量之前,需要按顺序遍历这些语句。
b
c
(然而,可以并行地编译和优化单独的基本块。)
除此之外,不同的传球也需要按顺序执行,并相互影响。
例如: 根据指令调度,分配寄存器,然后发现需要将寄存器溢出到内存中,因此需要生成新的指令。这又改变了日程安排。
所以你也不能同时执行像“寄存器分配”和“调度”这样的“传递”(实际上,我 好好想想有一些文章,计算机科学家和数学家试图一起解决这两个问题,但是让我们不要深入)。
(同样,可以通过流水线传递来实现 一些并行性。)
此外,GPU 尤其不适合,因为:
GPU 擅长浮点运算。某些编译器不需要或使用很多东西(除非在程序中优化浮点算法)
GPU 擅长 SIMD。即对多个输入执行 一样操作。这也是编译器不需要做的事情。如果编译器需要优化几百个浮点操作(一个疯狂的例子是: 程序员定义了几个大的 FP 数组,给它们分配了常量,然后编写代码对它们进行操作。确实是一个写得非常糟糕的程序。)
因此,除了基本块的并行编译和流水线传递之外,曾经在“ C 文件内编译”级别上的并行性并不大。但是并行性是可能的,易于实现,并且可以在更高的级别上不断使用。例如,GNU Make具有 -j=N参数。这基本上意味着: 只要它找到 N独立的作业(通常,编译一大堆文件是 GNU Make的用途) ,它就会产生 N进程(或者 gcc的 N实例并行编译不同的文件)。
GNU Make
-j=N
N
gcc
如果你想问的是,“你能自动编写 GPU 加速的代码用于 GCC 和 LLVM 吗?”答案是肯定的。NVIDIA 和 Google 开发基于 LLVM 的开源编译器项目:
NVIDIA CUDA LLVM:
谷歌 GPUCC:
如果你的问题是,“我可以使用 GPU 来加速非 CUDA 通用代码编译?”目前答案是否定的。GPU 擅长某些事情,比如并行任务,不擅长其他事情,比如编译器的分支。好消息是,你可以使用带 CPU 的个人电脑网络来获得2-10倍的编译加速,这取决于你的代码是如何优化的,你可以得到最快的多核 CPU 和高速固态硬盘可用于您的桌面,以获得更少的麻烦之前,你诉诸于网络构建。
有一些工具可以将 C/C + +/Object 编译器任务分发到像 Distcc 这样的计算机网络中。它曾经包含在 XCode 的旧版本中,但是已经被删除了,并且不支持在 Swift 中使用它。
有一个类似于 Distcc 的商业工具,名为 Incredibuild,它支持 Visual Studio c/c + + 和 Linux 开发环境:
有一些很好的文章介绍了 Incredibuild 和 Distcc 的实际应用,以及与本地编译器中的增量构建支持相比的权衡。本地编译器支持在不重新编译其他所有内容的情况下对单个文件中的一行进行小的更改。需要考虑的要点: