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

时间:2011-12-07 14:36:31

标签: gcc compiler-construction gpu hardware-acceleration

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

如果没有此类工具,请就是否使用OpenCL或其他任何内容重新编程我的代码提出建议。

2 个答案:

答案 0 :(得分:30)

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

示例:查看常量传播可能如何工作 -

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

在确定分配给bc的值在编译时是常量之前,您需要按顺序查看这些语句。

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

B。除此之外,不同的传递也需要按顺序执行,并相互影响。

示例:根据指令计划,您分配寄存器,然后您发现需要将寄存器溢出到内存,因此您需要生成新指令。这会再次改变时间表。

所以你不能同时执行“寄存器分配”和“调度”之类的“传递”(实际上,我认为有些文章计算机科学家/数学家试图解决这两个问题问题在一起,但不要进入那个。)

(同样,可以通过流水线传递实现某些并行性。)

此外,GPU特别适合,因为:

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

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

  3. 除了并行化基本块和流水线传递的编译之外,在“C文件的编译”中,具有的并行性并不多。但并行性是可能的,易于实现,并且在更高级别上不断使用。例如,GNU Make具有-j=N参数。这基本上意味着:只要找到N个独立的工作(通常,编译一堆文件就是GNU Make无论如何),它会产生N个进程(或{{1 N并发编译不同文件的实例。

答案 1 :(得分:11)

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

NVIDIA CUDA LLVM:

GOOGLE GPUCC:

如果你的问题是,“我可以使用GPU来加速非CUDA通用代码编译吗?”目前答案是否定的。 GPU擅长某些事情,比如并行任务,对其他人来说很糟糕,比如编译器所涉及的分支。好消息是,您可以使用具有CPU的PC网络来获得2-10倍的编译加速,具体取决于您的代码已经优化的程度,并且您可以获得最快的多核CPU和高速SSD供您的桌面使用在诉诸网络构建之前,以便减少麻烦。

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

有一种类似于Distcc的商业工具,名为Incredibuild,支持Visual Studio C / C ++和Linux开发环境:

有一些关于真实世界使用Incredibuild vs Distcc和权衡的好文章与本机编译器中的增量构建支持相比,它可以在单个文件中进行类似单行的小改动,而无需重新编译其他所有内容。需要考虑的要点:

  • 您可以通过预编译标头,使用多个DLL以及在单个计算机上使用增量构建来显着加快代码库。
  • Incredibuild是一个更完整的解决方案,用于自动分配工作并保证与串行编译相同的结果相比,使用distcc免费执行此操作,您必须为相同的结果和与gcc以外的任何其他内容的兼容性做更多的工作
  • 有关详细信息,请参阅http://gamesfromwithin.com/how-incredible-is-incredibuild