标签: jit

任何将Clang作为脚本解释器嵌入到C++代码中的教程?

我没有llvm或clang的经验.据我所知,clang被认为很容易嵌入维基百科 -但是,我没有找到任何有关如何实现这一目标的教程.那么有可能通过JIT在运行时编译和执行用户定义的代码来为c ++应用程序的用户提供脚本功能吗?是否可以调用应用程序自己的类和方法并共享对象?

编辑:我更喜欢脚本语言的C语法(甚至C++本身)

c++ jit llvm clang embedded-language

16
推荐指数
3
解决办法
1万
查看次数

.NET运行时与Java热点:.NET一代落后了吗?

根据我可以收集的有关.NET和Java执行环境的信息,目前的情况如下:

抛开基准并且无意升级圣战,这是否意味着Java Hotspot VM比.Net领先一代.这些在Java VM中使用的技术最终是否会进入.NET运行时?

.net java comparison jit jvm-hotspot

16
推荐指数
3
解决办法
2518
查看次数

JIT是否生成了错误的代码

我一直在找你,有些代码无效.除了下面的一行,一切看起来都很好.

Transport = Transport?? MockITransportUtil.GetMock(true);
Run Code Online (Sandbox Code Playgroud)

执行该行之前,Transport为null.我看到GetMock已执行,并且它返回一个非null对象.在该行之后,运输仍为空;

我看了生成的IL,看起来很好.

 IL_0002:  ldarg.0
  IL_0003:  ldfld      class [Moq]Moq.Mock`1<class [CommLibNet]CommLibNET.ITransport> Curex.Services.Common.UnitTests.Messaging.TestIGuaranteedSubscriptionBase::Transport
  IL_0008:  dup
  IL_0009:  brtrue.s   IL_0012
  IL_000b:  pop
  IL_000c:  ldc.i4.1
  IL_000d:  call       class [Moq]Moq.Mock`1<class [CommLibNet]CommLibNET.ITransport> Curex.Services.Common.UnitTests.Mocking.MockITransportUtil::GetMock(bool)
  IL_0012:  stfld      class [Moq]Moq.Mock`1<class [CommLibNet]CommLibNET.ITransport> Curex.Services.Common.UnitTests.Messaging.TestIGuaranteedSubscriptionBase::Transport
Run Code Online (Sandbox Code Playgroud)

我们看到函数被调用,stfld应该获取返回值并设置字段.

所以我然后查看了程序集,我看到调用已经完成,但看起来RAX中的返回被下一次调用吹走了并且丢失了.

            Transport = Transport?? MockITransportUtil.GetMock(true);
000007FE9236F776  mov         rax,qword ptr [rbp+0B0h]  
000007FE9236F77D  mov         rax,qword ptr [rax+20h]  
000007FE9236F781  mov         qword ptr [rbp+20h],rax  
000007FE9236F785  mov         rcx,qword ptr [rbp+20h]  
000007FE9236F789  mov         rax,qword ptr [rbp+0B0h]  
000007FE9236F790  mov         qword ptr [rbp+28h],rax  
000007FE9236F794  test        rcx,rcx  
000007FE9236F797  jne         000007FE9236F7AC  
000007FE9236F799  mov …
Run Code Online (Sandbox Code Playgroud)

c# jit

16
推荐指数
2
解决办法
341
查看次数

如何在低(汇编)级别捕获和处理异常?

我有这个代码 -

try {
     doSomething();
} catch (Exception e) {
   e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

这将如何实际由编译器实现.实际放入汇编代码生成的异常检查在哪里?

更新
我知道上面的代码如何转换为字节码.字节码仅将try-catch转换为相应的try-handler块.我感兴趣的是它将如何转换为汇编/并由jvm处理.

java jit code-generation

16
推荐指数
2
解决办法
1335
查看次数

Hotspot JIT编译器是否可以重现任何指令重新排序?

我们知道,一些JIT允许重新排序对象初始化,例如,

someRef = new SomeObject();
Run Code Online (Sandbox Code Playgroud)

可以分解为以下步骤:

objRef = allocate space for SomeObject; //step1
call constructor of SomeObject;         //step2
someRef = objRef;                    //step3
Run Code Online (Sandbox Code Playgroud)

JIT编译器可能会重新排序如下:

objRef = allocate space for SomeObject; //step1
someRef = objRef;                    //step3
call constructor of SomeObject;         //step2
Run Code Online (Sandbox Code Playgroud)

即,步骤2和步骤3可以由JIT编译器重新排序.虽然这在理论上是有效的重新排序,但我无法使用x86平台下的Hotspot(jdk1.7)重现它.

那么,Hotspot JIT comipler是否可以重现任何指令重新排序?


更新:我使用以下命令在我的机器(Linux x86_64,JDK 1.8.0_40,i5-3210M)上进行了测试:

java -XX:-UseCompressedOops -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand="print org.openjdk.jcstress.tests.unsafe.UnsafePublication::publish" -XX:CompileCommand="inline, org.openjdk.jcstress.tests.unsafe.UnsafePublication::publish" -XX:PrintAssemblyOptions=intel -jar tests-custom/target/jcstress.jar -f -1 -t .*UnsafePublication.* -v > log.txt 
Run Code Online (Sandbox Code Playgroud)

我可以看到该工具报告的内容如下:

[1] 5可接受对象已发布,至少有1个字段可见.

这意味着观察者线程看到了一个未初始化的MyObject实例.

但是,我没有看到像@ Ivan那样生成的汇编代码:

0x00007f71d4a15e34: mov r11d,DWORD PTR …
Run Code Online (Sandbox Code Playgroud)

java multithreading jit jvm jvm-hotspot

16
推荐指数
1
解决办法
581
查看次数

jitted函数的行为不一致

我有一个非常简单的功能,如下所示:

import numpy as np
from numba import jit
import pandas as pd

@jit
def f_(n, x, y, z):
    for i in range(n):
        z[i] = x[i] * y[i] 

f_(df.shape[0], df["x"].values, df["y"].values, df["z"].values)
Run Code Online (Sandbox Code Playgroud)

我通过了

df = pd.DataFrame({"x": [1, 2, 3], "y": [3, 4, 5], "z": np.NaN})
Run Code Online (Sandbox Code Playgroud)

我希望该函数将修改数据z列,如下所示:

>>> f_(df.shape[0], df["x"].values, df["y"].values, df["z"].values)
>>> df

   x  y     z
0  1  3   3.0
1  2  4   8.0
2  3  5  15.0
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下工作正常,但不知何故无法修改其他数据.

我仔细检查了一下事情:

  • 我还没有确定可能导致此问题的数据点的任何问题.
  • 我看到在打印结果时,数据会按预期进行修改.
  • 如果我z从函数返回数组,它将按预期进行修改.

不幸的是,我无法将问题简化为可重复性最小的案例.例如,删除不相关的列似乎"修复"问题,使得减少不可能.

jit …

python jit numpy pandas numba

16
推荐指数
1
解决办法
479
查看次数

Java:JIT方法内联

Java JIT 何时内联方法调用?它是基于#times调用调用方法(如果是,该数字是什么?),或者其他一些标准(那将是什么?)

我已经读过JIT可以内联'final'方法,但它也会根据运行时统计信息内联非最终方法,所以想知道什么是触发条件.

我想答案会因JVM的实现而有所不同,但也许所有这些都有共同之处?

java jit inline

15
推荐指数
2
解决办法
3647
查看次数

JIT与AOT编译

这个问题与android系统有关. Dalvik VM使用JIT概念,这意味着当您第一次运行应用程序时,Dalvik VM会将其编译并加载到RAM中,只要它可以保留在那里.我理解这个概念.但是名为ART的新虚拟机使用了AOT方法.ART在安装后编译应用程序(或安装时?).这意味着什么?由编译的应用程序ART是相同的已编译的应用程序(如C的应用程序),但在从操作系统的其余部分分离的分离工艺运行?有人可以更彻底地向我解释这个概念.我必须做一些介绍,这是在那里提到的,但是我不明白这个概念,如果有人问我这个问题,我不想看起来很蠢:)抱歉因为英语不好,如果有人会很好可以编辑一下问题.

android jit compilation

15
推荐指数
1
解决办法
6428
查看次数

如何确定Hotspot JVM决定再次重新编译JIT:ed代码的原因?

我正在尝试为延迟敏感的Java应用程序编写一个预热例程,以便优化前几个可能因动态类加载和JIT(主要是)而减慢的事务.

我面临的问题是,即使我的预热代码加载所有类并通过多次调用它们(至少100次-XX:CompileThreshold)来练习它们,之后当实际用户登录这些相同的函数时仍然标记为"非参赛者"并再次重新编译,这会造成延迟.

JVM标志如下(我只添加了-XX:+ PrintCompilation -verbose:class tp troubleshoot,其他是遗留的):

-Xms5g -Xmx5g -server -XX:+ AggressiveHeap -XX:+ UseFastAccessorMethods -XX:+ PrintGCDetails -XX:CompileThreshold = 100 -XX:-CITime -XX:-PrintGC -XX:-PrintGCTimeStamps -XX:+ PrintCompilation -verbose:类

#Warmup happens here
  12893 2351       my.test.application.hotSpot (355 bytes)
#Real user logs on here
 149755 2351      made not entrant  my.test.application.hotSpot (355 bytes)
 151913 2837       my.test.application.hotSpot (355 bytes)
 152079 2351      made zombie  my.test.application.hotSpot (355 bytes)
Run Code Online (Sandbox Code Playgroud)

在预热之后没有发生类加载(我之前可以看到类加载,因此标志正在工作).

看起来该函数获得了一个新的ID(2351 vs 2837),这意味着它被JVM视为"不同".

我如何确定JVM决定重新编译此函数的原因?

我想这归结为我如何确定ID改变的原因?标准是什么?

我尝试尽可能多地标记尽可能多的方法和类,但无济于事.

这是JRE 1.6.0_45-b06.

有关如何排除故障或获取更多信息的任何提示!:)

java jit jvm-hotspot jvm-arguments

15
推荐指数
1
解决办法
671
查看次数

如何使numba @jit使用所有cpu核心(parallelize numba @jit)

我正在使用numbas @jit装饰器在python中添加两个numpy数组.如果我使用@jit相比,性能是如此之高python.

但是,即使我传入,也没有使用所有CPU内核@numba.jit(nopython = True, parallel = True, nogil = True).

有没有办法利用numba的所有CPU内核@jit.

这是我的代码:

import time                                                
import numpy as np                                         
import numba                                               

SIZE = 2147483648 * 6                                      

a = np.full(SIZE, 1, dtype = np.int32)                     

b = np.full(SIZE, 1, dtype = np.int32)                     

c = np.ndarray(SIZE, dtype = np.int32)                     

@numba.jit(nopython = True, parallel = True, nogil = True) 
def add(a, b, c):                                          
    for i in range(SIZE):                                  
        c[i] = a[i] + b[i]                                 

start = …
Run Code Online (Sandbox Code Playgroud)

python jit multicore numpy numba

15
推荐指数
2
解决办法
6112
查看次数