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