标签: jit

我可以将现有方法绑定到LLVM函数*并从JIT编译的代码中使用它吗?

我正在使用LLVM C++ API.我想JIT编译代码并运行它.

但是,我需要从所述JIT编译的代码中调用C++方法.通常,LLVM将方法调用视为函数调用,并将对象指针作为第一个参数传递,因此调用不应该是一个问题.真正的问题是将该功能转换为LLVM.

据我所知,可以使用外部链接功能,并通过其名称获取它.问题是,因为它是一个C++方法,它的名字会被破坏,所以我不认为这样做是个好主意.

使FunctionType对象很容易.但是从那里,我如何通知LLVM我的方法并Function为它获取一个对象?

c++ jit llvm

19
推荐指数
3
解决办法
5851
查看次数

性能说明:预热后代码运行速度较慢

下面的代码运行完全相同的计算3次(它没有做太多:基本上添加从1到100米的所有数字).前两个块的运行速度比第三个块快约10倍.我已经运行了这个测试程序超过10次,结果显示非常小的差异.

如果有的话,我希望第三个块运行得更快(JIT编译),但典型的输出是:

35974537
36368455
296471550

有人能解释一下发生了什么吗?(为了清楚起见,我不是想在这里修改任何东西,只是想更好地了解发生了什么)

注意:

  • 程序期间没有GC运行(监控-XX:+PrintGC)
  • 使用Oracle JDK版本1.6.0_30,1.7.0_02和1.7.0_05进行测试
  • 还测试了以下参数:-XX:+PrintGC -Xms1000m -Xmx1000m -XX:NewSize=900m=>相同的结果
  • 它将块放入循环中,所有运行都很快
  • 如果将块提取到方法,则所有运行都很快(无论方法被调用3次还是循环都没有区别)
public static void main(String... args) {
    //three identical blocks
    {
        long start = System.nanoTime();
        CountByOne c = new CountByOne();
        int sum = 0;
        for (int i = 0; i < 100000000; i++) {
            sum += c.getNext();
        }
        if (sum != c.getSum()) throw new IllegalStateException(); //use sum
        long end = System.nanoTime();
        System.out.println((end - start));
    }
    {
        long start = System.nanoTime();
        CountByOne …
Run Code Online (Sandbox Code Playgroud)

java performance jit jvm

19
推荐指数
1
解决办法
728
查看次数

使用NGEN有帮助吗?

当我们知道它不会改变太多时,使用NGEN和ASP.NET应用程序是否更好?或者JIT足够好吗?

我问的唯一原因是因为Jeffrey Richter在2002年的这篇文章说:

当然,Microsoft正在努力改进CLR及其JIT编译器,以便它运行得更快,生成更优化的代码,并更有效地使用内存.这些改进需要时间.对于不能等待的开发人员,.NET Framework可再发行组件包含一个名为NGen.exe的实用程序.

asp.net jit ngen

18
推荐指数
2
解决办法
9210
查看次数

LLVM jit和native

我不明白LLVM JIT如何与正常的无JIT编译相关,文档也不好.

例如,假设我使用clang前端:

  1. 案例1:我使用clang/llvm将C文件编译为native.我理解的这个流程就像gcc流程 - 我得到了我的x86可执行文件并运行.
  2. 案例2:我编译成在LLVM JIT上运行的某种LLVM IR.在这种情况下,可执行文件包含LLVM运行时以在JIT上执行IR,或者它是如何工作的?

这两者有什么区别,是否正确?LLVM流程是否包括对JIT和非JIT的支持?我什么时候想使用JIT - 对于像C这样的语言来说它有意义吗?

jit llvm clang

18
推荐指数
3
解决办法
2万
查看次数

将LLVM JIT代码链接到外部C++函数

我正在编写一个LLVM脚本引擎,JIT用自定义语言编写脚本代码.我的问题是我无法调用外部函数(即使C99 erf()函数失败).

例如,如果我extern"C"erf函数,

extern "C" double erft(double x){
return erf(x);
}
Run Code Online (Sandbox Code Playgroud)

并创建一个外部链接功能

std::vector<const Type*> Double1(1,Type::getDoubleTy(getGlobalContext()));
FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),Double1,false);
Function *erft = Function::Create(FT,Function::ExternalLinkage,"erft",TheModule);
Run Code Online (Sandbox Code Playgroud)

使用erft(0.0)运行脚本时出现以下错误消息:

LLVM错误:程序使用的外部功能'erft'无法解决!

手动执行映射,

void ExecutionEngine::addGlobalMapping( const GlobalValue *  erfF, void *  erft); 
Run Code Online (Sandbox Code Playgroud)

会得到以下错误:

在类之外的`void llvm :: ExecutionEngine :: addGlobalMapping(const llvm :: GlobalValue*,void*)'的声明不是定义

显然我做错了.任何帮助将非常感激

linker jit llvm

18
推荐指数
2
解决办法
6115
查看次数

ProfileOptimization实际上有效吗?

.NET 4.5的新性能增强之一是引入了"MultiCode JIT".

有关详细信息,请参见此处

我试过这个,但似乎对我的申请没有影响.

我感兴趣的原因是我的应用程序(IronScheme)需要很长时间才能启动,如果不是NGEN,这意味着启动时会涉及相当数量的JIT'ng.(NGEN时为1.4秒vs 0.1秒).

我已经按照如何启用它的说明进行操作,我可以看到创建了一个"小"(4-12KB).但是在随后的启动中,似乎对改善启动时间没有任何影响.它仍然是1.4秒.

有没有人在实践中看到(或制作过)这项工作?

此外,对哪些代码进行"跟踪"有任何限制吗?例如:集加载上下文,瞬态组件等我问这个作为创建的文件似乎永远不会长大,但我其实生成的代码中有相当(在瞬态组装).

我遇到的一个错误是,SetProfileRoot似乎不理解/作为路径分隔符,请确保使用\.

jit multicore .net-4.5

18
推荐指数
2
解决办法
4419
查看次数

可能的.NET JIT调用参数生存期错误?

由于.NET运行时出现内部错误(退出代码0x80131506),我一直在追逐.NET服务中间歇性崩溃的原因.有问题的服务不执行任何通常应归咎于此类错误的操作(不安全代码,PInvoke等).我已尝试禁用并发GC,如KB2679415中所述,以及切换到服务器GC,但间歇性崩溃仍然存在.在调试模式下编译时,问题在.NET 4.7.2及更早版本中出现.

该服务广泛使用旧版本的NHibernate(2.0.1),当我在调试器中检查崩溃转储时,在发生错误时,callstack中总会有NHibernate代码,尽管NHibernate本身都是托管代码,所以不应该导致这种崩溃.

我已设法在调试器下重现崩溃并启用GC压力日志和堆验证,虽然它似乎指向JIT/GC中的问题,但我不确定我是否正确解释输出.

查看发生崩溃的线程,此时它发生在clr!JIT_Stelem_Ref:

clr!JIT_Stelem_Ref+0x18: cmp     r9,qword ptr [r8] ds:aaaaaaaa`aaaaaaaa=????????????????
Run Code Online (Sandbox Code Playgroud)

在这种情况下,0xaas 字符串似乎是启用HeapVerify的结果,这会导致GC填充收集的内存区域,可能是为了更容易识别,并建议我们仍然有一个对收集/重定位对象的旧位置的引用.

追溯到堆栈中,有很多0xaaaaaaaaaaaaaaaa条目,但是当最近的GC发生时,这些停止出现在调用堆栈顶部的方法中,在这种情况下,NHibernate.Loader.Loader.GetRow()根据最近的GC压力日志此线程上的GC:

(注意:我已经从SOS' !dumplog输出中反转了记录行的顺序,以便于阅读):

2404 12445.672380360 : `GC`GCROOTS`         Starting scan of Thread 000000001EF4DED0 ID = 20 {
2404 12445.672380963 : `GCROOTS`            Scanning ExplicitFrame 000000001E6ED3B8 AssocMethod = 0000000000000000 frameVTable = 000007FEF365B640 (clr!RedirectedThreadFrame::`vftable')
2404 12445.672386397 : `GCROOTS`            Scanning Frameless method 000007FE93F43460 (NHibernate.Loader.Loader.GetRow(System.Data.IDataReader, NHibernate.Persister.Entity.ILoadable[], NHibernate.Engine.EntityKey[], System.Object, NHibernate.Engine.EntityKey, NHibernate.LockMode[], System.Collections.IList, NHibernate.Engine.ISessionImplementor)) ControlPC = 000007FE945E3095
2404 12445.672388208 : `GC`GCROOTS`             GC …
Run Code Online (Sandbox Code Playgroud)

.net c# jit garbage-collection

18
推荐指数
1
解决办法
394
查看次数

你会如何改进Dalvik?Android的虚拟机

我目前正在Android平台上撰写论文.经过一番研究,很明显Dalvik还有改进的余地.我想知道,你觉得开发人员在这个目标上的最佳用途是什么?

JIT编译似乎是一个很大的问题,但后来我也听说过这种资源在这么低资源的机器上使用有限.有没有人有资源或数据支持这一点?

是否还有其他选择需要考虑?除了开发强大的本机开发工具包以绕过VM.

对于那些感兴趣的人,有一个关于Dalvik VM的录音和在线讲座.

任何想法都欢迎,因为这个问题似乎是主观的,我会澄清我接受的答案必须有一些理由提出修改.任何支持它的数据,例如Sun JVM引入时的改进,都将是一个巨大的优势.

android jit dalvik vm-implementation

17
推荐指数
1
解决办法
7902
查看次数

什么时候java比c ++快(或者什么时候JIT更快然后预编译)?

可能重复:
JIT编译器与脱机编译器

我听说在某些情况下,由于JIT优化,Java程序或java程序的某些部分能够比C++(或其他预编译代码)中的"相同"代码执行得更快.这是因为编译器能够确定某些变量的范围,避免一些条件并在运行时拉出类似的技巧.

你能给出一个(或更好 - 一些)例子吗?并且可能概述了编译器能够优化字节码超出预编译代码可能性的确切条件?

注意:这个问题不是将Java与C++进行比较.它关于JIT编译的可能性.请不要燃烧.我也不知道有任何重复.如果你是的话请指出来.

java compiler-construction optimization performance jit

17
推荐指数
3
解决办法
2万
查看次数

为什么.net 4.5中的Multicore JIT没有"默认开启"?

在.net 4.5中有一个名为Multicore JIT的新功能

http://blogs.msdn.com/b/dotnet/archive/2012/10/18/an-easy-solution-for-improving-app-launch-performance.aspx

它可以提高应用启动时间的性能.

但是,您需要在代码中启用它.

那么为什么默认情况下它没有开启?

.net jit multicore

17
推荐指数
1
解决办法
3148
查看次数