clu*_*ess 48 compiler-construction gcc gpu hardware-acceleration
有没有办法或工具在使用GCC编译器编译程序时应用GPU加速?现在我已经创建了一个程序来迭代地编译给定的程序列表.这需要几分钟.我知道像Pyrit这样的一些程序有助于将GPU加速应用于预计算哈希.
如果没有这样的工具,请建议是否使用OpenCL或其他任何东西来重新编程我的代码.
Arj*_*kar 30
答:在命令式编程语言中,语句按顺序执行,每个语句都可能改变程序的状态.因此,分析翻译单元本质上是顺序的.
一个例子:查看常量传播可能如何工作 -
a = 5;
b = a + 7;
c = a + b + 9;
Run Code Online (Sandbox Code Playgroud)
在确定在编译时分配给b和的值c是常量之前,您需要按顺序查看这些语句.
(但是,可能会相互并行地编译和优化单独的基本块.)
B.除此之外,不同的传递也需要顺序执行,并相互影响.
示例:根据指令计划,您分配寄存器,然后您发现需要将寄存器溢出到内存,因此您需要生成新指令.这会再次更改计划.
所以你不能同时执行"寄存器分配"和"调度"之类的"传递"(实际上,我认为有些文章中计算机科学家/数学家一起试图将这两个问题一起解决,但不要赘述) .
(同样,通过流水线传递可以实现一些并行性.)
此外,GPU尤其不合适,因为:
GPU擅长浮点数学运算.某些编译器不需要或使用太多(除非在程序中优化浮点运算)
GPU擅长SIMD.即对多个输入执行相同的操作.这也是编译器需要做的事情.有可能是一个好处,如果编译器需要,比如说,优化几百个浮点运算远(一种野生的例子是:程序员定义的几大FP阵列,分配常量给他们,然后写代码来对这些操作.写得非常糟糕的节目.)
因此,从并行基本块和流水线通行证汇编分开,没有太多的并行将不得不在"C文件编制内"的水平.但并行性是可能的,易于实现,并且在更高级别上不断使用.GNU Make例如,有这个-j=N论点.这基本上意味着:只要它找到N独立的工作(通常,编译一堆文件就是GNU Make用于任何方式),它会产生N进程(或并行编译不同文件的N实例gcc).
小智 14
如果你问的是,"你能自动编写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和权衡的好文章与本机编译器中的增量构建支持相比,它可以在单个文件中进行类似单行的小改动,而无需重新编译其他所有内容.需要考虑的要点: