即时编译器(JIT)在数学方面的应用

8
我正在寻找一个可以嵌入我的程序中的JIT编译器或小型编译器库。我打算使用它来编译执行复杂数算术的动态生成代码。生成的代码结构非常简单:没有循环,没有条件语句,但长度可能相当长(在GCC编译时几MB)。生成的机器码的性能很重要,而我并不真正关心编译本身的速度。哪个JIT编译器最适合我的目的?谢谢!
详细需求:
- 支持双精度复数算术 - 支持基本优化 - 支持多种CPU(至少支持x86和x86-64) - 在支持的CPU上利用SSE - 支持堆栈或大量寄存器用于本地变量 - ANSI-C或C++接口 - 跨平台(主要是Linux、Unix)
3个回答

6
您可能想了解一下LLVM

2

Cint是一个C++(类似的)环境,它提供了混合编译代码和解释执行代码的能力。有一套解释器优化工具。而ROOT则更进一步,支持在运行时进行编译和链接(参见http://root.cern.ch/drupal/content/cint-prompt的最后一部分),虽然它似乎使用系统编译器,因此可能没有太大帮助。所有代码都是开源的。

我在工作中经常使用这些功能。

我不知道它是否主动使用SIMD指令,但它似乎符合你的其他要求。


看到您目前正在使用编译成动态库并在链接时进行动态链接的方法,您可以考虑TCC,尽管我不认为它会做太多优化,并且怀疑它不支持SIMD。


我不知道Cint实际上可以即时将代码编译成字节码。很好知道这一点。但是我尝试了几个例子,性能令人失望。它生成的代码通常比GCC生成的代码慢几倍,有时甚至慢了几个数量级。 - user359781
我总是尽早转向系统编译代码,并从未对REPL环境进行基准测试。然而,我发现了一篇讨论字节码编译器中可用优化级别的页面。不知道你是否看到了。我的调查表明,我想到的一个功能实际上属于ROOT,我会进行编辑。 - dmckee --- ex-moderator kitten

0

听起来你想要实时编译并动态加载已编译的库文件(.DLL或.so)。这将为您提供最佳性能,使用ANSI-C或C++接口。因此,请忘记JITing并考虑生成C/C++编译器进行编译。

当然,这假设编译器可以安装在实际生成动态代码的点上。


这确实是我现在正在做的事情。使用GCC或Intel C编译器编译代码,并动态加载生成的.so文件。然而,问题在于我发现很难将一个完整的编译器打包到我的程序中。除了许可证问题之外,仅技术部分就可能是太多的工作。 - user359781

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接