在gcc编译器上编译多个程序时可以使用GPU加速吗?

有什么方法或工具来应用GPU加速编译与GCC编译器的程序? 现在我已经创build了一个程序来迭代地编译给定的程序列表。 这需要几分钟的时间。 我知道像Pyrit这样的一些程序,它有助于将GPU加速应用于预计算哈希。

如果没有可用的工具,请咨询是否使用OpenCL或其他任何程序来重新编程我的代码。

A.在命令式编程语言中,语句按顺序执行,每个语句都可能改变程序的状态。 因此分析翻译单位本质上是连续的。

一个例子:看看如何持续传播可能工作 –

a = 5; b = a + 7; c = a + b + 9; 

在计算出分配给bc的值是编译时的常量之前,您需要按顺序经过这些语句。

(然而,单独的基本块可能是相互并行编译和优化的。)

B.最重要的是,不同的通行证也需要按顺序执行,并相互影响。

一个例子:根据指令的时间表,你分配寄存器,然后你发现你需要溢出一个寄存器到内存,所以你需要生成新的指令。 这又改变了时间表。

所以你不能像“寄存器分配”和“调度”那样同时执行“通行证”(实际上,我认为有些文章是计算机科学家/math家一起试图解决这两个问题的,但是不要赘述) 。

(再次,通过stream水线可以达到一些并行性。)

而且,GPU特别不适合,因为:

  1. GPU擅长浮点math。 某些编译器不需要或使用太多(除了在程序中优化浮点运算时)

  2. graphics处理器擅长SIMD。 即对多个input执行相同的操作。 这再次,不是编译器需要做的事情。 如果编译器需要优化几百个浮点运算(例如:程序员定义了几个大的FP数组,然后给它们分配常量,然后编写代码来操作这些数组),那么编译器可能会有好处。确实写得非常糟糕。

因此,除了对基本块和stream水线的编译进行并行化处理之外,在“编译C文件”的层面上并没有太多的并行性。 但是并行性是可能的,易于实现,并且在更高层次上不断使用。 例如, GNU Make-j=N参数。 这基本上意味着:只要findN独立的作业(通常编译一堆文件就是GNU Make的使用),它会产生N进程(或者N并行编译不同文件的gcc实例)。

如果你问的是“你能自动编写GPU加速代码来使用GCC和LLVM吗? 答案是肯定的 NVIDIA和Google开发基于LLVM的开源编译器项目:

NVIDIA CUDA LLVM:

GOOGLE GPUCC:

如果你的问题是,“我可以使用GPU来加速非CUDA通用代码编译吗? 答案是目前没有。 GPU擅长并行任务,对于其他编译器所关心的分支也不错。 好消息是,您可以使用带有CPU的PCnetworking来获得2-10倍的编译速度,具体取决于您的代码已经优化了多less,并且您可以获得可用于桌面的最快的多核CPU和高速SSD在使用networking构build之前获得更less的麻烦。

有一些工具可以将C / C ++ / ObjC编译器任务分发到Distcc等计算机networking。 它被包含在旧版本的XCode中,但已被删除,并且不支持在Swift中使用它。

有一个类似于Distcc的商业工具叫做Incredibuild,它支持Visual Studio C / C ++和Linux开发环境:

有一些关于实际使用Incredibuild vs Distcc和折衷的优秀文章,与本地编译器中的增量构build支持相比,在单个文件中进行小的更改(如单行)而不重新编译其他所有内容。 要考虑的要点:

  • 通过预编译头文件,使用多个DLL以及在单个机器上使用增量构build,可以显着加速代码库的速度。
  • Incredibuild是一个更完整的解决scheme,用于自动分配工作,并保证与串行编译相同的结果,而不是使用distcc进行免费的工作,因为您需要做更多的工作才能获得与gcc相同的结果和兼容性。
  • 有关详细的评论,请参阅http://gamesfromwithin.com/how-incredible-is-incredibuild