有没有办法或工具在使用GCC编译器编译程序时应用GPU加速?现在我已经创建了一个程序来迭代地编译给定的程序列表。这需要几分钟。我知道像Pyrit这样的一些程序有助于将GPU加速应用于预计算哈希值。
如果没有此类工具,请就是否使用OpenCL或其他任何内容重新编程我的代码提出建议。
答案 0 :(得分:30)
A。在命令式编程语言中,语句按顺序执行,每个语句都可能改变程序的状态。因此,分析翻译单元本质上是顺序的。
示例:查看常量传播可能如何工作 -
a = 5;
b = a + 7;
c = a + b + 9;
在确定分配给b
和c
的值在编译时是常量之前,您需要按顺序查看这些语句。
(但是,可能会相互并行地编译和优化单独的基本块。)
B。除此之外,不同的传递也需要按顺序执行,并相互影响。
示例:根据指令计划,您分配寄存器,然后您发现需要将寄存器溢出到内存,因此您需要生成新指令。这会再次改变时间表。
所以你不能同时执行“寄存器分配”和“调度”之类的“传递”(实际上,我认为有些文章计算机科学家/数学家试图解决这两个问题问题在一起,但不要进入那个。)
(同样,可以通过流水线传递实现某些并行性。)
此外,GPU特别适合,因为:
GPU擅长浮点数学。某些编译器不需要或使用太多(除非在程序中优化浮点运算时)
GPU擅长SIMD。即对多个输入执行相同的操作。这也是编译器需要做的事情。如果编译器需要优化几百个浮点运算,那么可能是一个好处(一个疯狂的例子是:程序员定义了几个大的FP数组,为它们分配了常量,然后写了代码来操作这些。确实写得非常糟糕的程序。)
除了并行化基本块和流水线传递的编译之外,在“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和权衡的好文章与本机编译器中的增量构建支持相比,它可以在单个文件中进行类似单行的小改动,而无需重新编译其他所有内容。需要考虑的要点: