我很想听听人们对在FPGA上实现编译器有多难的看法。这可能只是一个编译器后端,例如LLVM,并且实现将只接受LLVM IR和输出机器代码。
这样做的目的是允许--可以这么说--实时执行源代码(或中间表示代码),也就是说:
对于给定的系统,FPGA的一个或多或少的静态部分可能是LLVM后端,即。决定输出哪种类型的机器代码的部分,例如使用SSE4的x86-64。或手臂拇指-2与霓虹灯和VFP指令。除非您有一个具有多个CPU的系统,否则这将保持不变。但是,这不应该是完全静态的,因此不应该在硬件中实现,因为对编译器的优化是不断进行的,并且需要不时地更新。更频繁的改变部分的FPGA将是前端,部分产生的LLVM IR从给定的语言: C,C++,Vala等。
这个系统的好处是,代码总是被优化到当前系统中的CPU。在当前情况下,很少有构建会利用CPU中的所有额外功能: SSE、AVX、3 3DNow!、Neon、VFP。使用这种(完全假设的)方法,可以利用CPU的全部潜力,为特定的体系结构进行实时编译,然后立即执行生成的指令。这对于基于ARM的系统尤其有用,因为我们需要从CPU中挤出所有的能量,而CPU本身在编译过程中非常缓慢。
我知道gcc可以被设置为使用线程,并且,我假设并行化编译器会比较容易。只是并行编译所有源文件。
我们还可以抛弃前端--编程语言--编译器的特定部分--只需将程序作为中间表示代码分发,比如LLVM。
这是否可行呢?
发布于 2011-06-05 21:00:06
我不会费心的。我将FPGA配置为LLVM并运行代码,将硬件控制委托给CPU。
发布于 2011-06-05 22:37:21
编译的某些部分很容易以非线程方式并行化。例如,字符串键字典非常常见,因此内容可寻址内存可以提供重要的优化。
不过,在编译的某些方面,FPGA的表现会非常糟糕。例如,过载解析必须考虑依赖于参数的查找、用户定义的转换、模板等。
通过流水线和使用FPGA和CPU的资源,您将获得最好的性能。例如,让FPGA lex源代码并创建一个令牌流,并将所有标识符替换为符号表索引,而CPU则运行稍后的编译步骤(例如,内联和循环优化)。
当然,您已经指出,如果可以对代码进行预处理并以p代码格式分发,这对每台机器的优化都没有多大帮助。不过,在开发过程中可能会成为一个很好的编译加速器。
发布于 2011-06-18 15:40:53
不久前我也有同样的想法。
考虑到充分的综合技术,在FPGA上实现这样一个复杂的程序是可能的。使用行为合成(又名C到HDL同步)使其可行。
有趣的是,如果编译器的输出也是HDL,那么可以想象引导行为合成器(即使其合成自身),这对于编译器来说通常是一个重要的验证步骤。
https://stackoverflow.com/questions/6245806
复制相似问题