- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经将一些 C 函数编译成 LLVM 字节码。现在我想让 Lua 脚本引擎可以访问这些函数,然后将 Lua 脚本编译成 native 机器代码。
我找到了 llvm-lua使用llvm编译lua脚本的项目。我现在想知道是否可以对从 lua 脚本调用的 C 函数执行 jit 编译和优化。
例如,我有这两个 C 函数:
void func1() {
for(int i = 1; i < 5; ++i)
printf("hello from func1");
}
void func2() {
for(int i = 1; i < 5; ++i)
printf("hello from func2");
}
然后我将它们暴露给 Lua 脚本引擎并运行这样的 lua 脚本:
func1()
func2()
然后我希望llvm-lua编译器对其进行优化,编译成对应的程序
for(int i = 1; i < 5; ++i) {
printf("hello from func1");
printf("hello from func2");
}
并且不成
for(int i = 1; i < 5; ++i)
printf("hello from func1");
for(int i = 1; i < 5; ++i)
printf("hello from func2");
有没有可能实现它?
干杯,
曼纽尔
最佳答案
对于任何类型的复杂程序转换(例如您要在此处实现的转换),最好尽可能多地删除增加复杂性的中间步骤。首先证明它适用于最简单的情况,然后逐步增加复杂性。对于您的特定问题,这转化为:尝试在同一文件中的所有代码的纯 C 代码上进行所需的优化,然后在不同文件中的纯 C 代码上进行,等等。如果您不能全部实现在更简单的情况下,那么你就不太可能通过所有额外的复杂性让它为最初的目标工作(并且通过逐步进行,你也会更好地了解你遇到的任何问题的可能原因) .
如果您遵循上述建议,我非常有信心(尽管我还没有尝试过)您想要的优化不会由 LLVM 优化器完成,即使是在最简单的情况下将所有内容都放在一个 C 文件中并以完全优化的方式运行。原因是您希望优化器更改代码的语义,因为不能保证两个连续的 for
循环与单个 for 具有相同的副作用(可观察到的变化)
循环,两个主体按顺序执行(您提供的代码就是一个很好的例子)。为了使优化安全,编译器必须能够保证(证明)关于从循环体执行的所有代码的副作用的各种属性。尽管并非不可能,但在一般情况下使用具有不受控制的副作用的语言(例如 C)很难做到,并且在大多数情况下,如果您跨越任何库边界(您可能会在这里这样做),那是不可行的,因为您实际上没有一个统一的优化步骤(至少在理论上)可以考虑所有必要的代码。如果你真的想更深入地研究 LLVM 及其优化器框架,我建议你先阅读这篇 excellent article outlining the motivations and design of LLVM ,然后找出优化器必须在一个步骤中查看哪些代码才能使其成为可能。
我建议考虑一下您尝试让 Lua 编译为 LLVM 位码并与来自 C 的 LLVM 位码一起优化的动机是什么。我确信有正当理由,但除非您绝对相信这是实现目标的唯一方法,那么我会亲自尝试不同的方法。
假设您的主要动机是表现。作为Andrew Y已经提到过,我建议好好看看 luajit .它使纯(写得体)Lua to perform close to C和 many times better than standard Lua ,它还包括一个 Foreign Function Interface (FFI)这可能对您的问题有帮助。来自 FFI 页面:
The FFI library allows calling external C functions and using C data structures from pure Lua code.
The FFI library largely obviates the need to write tedious manual Lua/C bindings in C. No need to learn a separate binding language — it parses plain C declarations! These can be cut-n-pasted from C header files or reference manuals. It's up to the task of binding large libraries without the need for dealing with fragile binding generators.
The FFI library is tightly integrated into LuaJIT (it's not available as a separate module). The code generated by the JIT-compiler for accesses to C data structures from Lua code is on par with the code a C compiler would generate. Calls to C functions can be inlined in JIT-compiled code, unlike calls to functions bound via the classic Lua/C API.
关于optimization - 使用 LLVM JIT 编译 lua 包装的 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6161300/
在动态语言中,动态类型代码 JIT 是如何编译成机器码的?更具体地说:编译器是否会在某个时候推断类型?还是在这些情况下严格解释? 例如,如果我有类似下面的伪代码 def func(arg) i
X86 和 AMD64 是许多计算环境(桌面、服务器和 super 计算机)最重要的架构。显然,JIT 编译器应该同时支持它们才能获得认可。 直到最近,SPARC 架构才是编译器合乎逻辑的下一步,特别
既然有如此多的 JIT 实现,每个 JIT 都会发出 native 代码。那么为什么没有人制作像 JIT2EXE 这样的工具来将 native 代码保存为 native 可执行文件呢? 最佳答案 这个
JIT 编译器将字节码编译成机器码的概念我还是不太清楚。我想知道为什么它比非 JIT 解释器产生更快的代码。有人可以给我一个很好的例子来说明这个过程是如何完成的吗? 最佳答案 假设您有一个需要执行一百
Torchscript 提供了 torch.jit.trace 和 torch.jit.script 将 pytorch 代码从 Eager 模式转换为脚本模型。从文档中,我可以理解 torch.ji
好的,我已经阅读了一些关于 JIT 和非 JIT 启用解释器之间差异的讨论,以及为什么 JIT 通常会提高性能。 但是,我的问题是: 最终,不支持 JIT 的解释器是否必须像 JIT 编译器那样将字节
有没有办法在消除 JIT 开销的同时实现 JIT 性能?最好通过将类文件编译为 native 镜像。 我研究过GCJ,但即使对于简单的程序,GCJ输出的性能也比Java JIT差很多。 最佳答案 您可
我试图更好地理解 JIT 编译器在 volatile 变量值缓存方面如何为 java 工作。考虑这个问题中提出的例子: Infinite loop problem with while loop an
我的代码是这样的: @jit(nopython=True) def sum_fn(arg1, arg2, ...argn): ..... for i in xrange(len(arg
以下代码无效: def get_unique(arr): return jnp.unique(arr) get_unique = jit(get_unique) get_unique(jnp.
我需要能够调用一个 GPU 函数,该函数本身间接调用另一个 GPU 函数: from numba import cuda, jit import numpy as np # GPU function
我有一个关于使用 Continuum 的 Accelerate 和 numba 包中的 Python CUDA 库的问题。正在使用装饰器@jit与 target = gpu同 @cuda.jit ?
有人可以指出我的方向,这可能会让我明白为什么 JIT 会取消优化我的循环? (OSR)。看起来它被 C1 编译一次,然后多次取消优化(我可以看到数十或数百个以 开头的日志) 这是包含该重要循环的类:
我引用了Oracle的以下文档: http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/underst_jit
我需要在 C++ 中运行预训练的 pytorch 神经网络模型(在 python 中训练)来进行预测。 为此,我按照此处给出的有关如何在 C++ 中加载 pytorch 模型的说明进行操作:https
我正在使用 numbas @jit 装饰器在 python 中添加两个 numpy 数组。如果我使用 @jit 与 python 相比,性能是如此之高。 然而,即使我传入 @numba.jit(nop
我是Python新手。 我编写了一些代码尝试将图片混合为新图片。 我完成了,但是浪费了太多时间。 所以我尝试使用 Numba 让代码在我的 GPU 上运行。但遇到一些警告和错误 os Ubuntu 1
我正在将我的网站从安装在共享网络托管帐户(在 DreamHost)上的 PHP v.5 转换为在 PHP 7.3.11 上运行。转换后,我开始注意到偶尔会收到以下警告: Warning: preg_m
在 Stack Overflow 上向所有编译器设计者致以问候。 我目前正在从事一个项目,该项目的重点是开发一种用于高性能计算的新脚本语言。源代码首先被编译成字节码表示。字节码然后由运行时加载,它对其
我相信 Apple 已禁止在 ARM64 架构上同时写入和执行内存,请参阅: 参见 mmap() RWX page on MacOS (ARM64 architecture)? 这使得像 jonesf
我是一名优秀的程序员,十分优秀!