Tag: jit

Python运行时:重新编译和重用C库

我正在开发一种用于对用户定义函数进行数值分析的工具。 我们的想法是在Python中创建一个方便的UI,用户可以在其中输入C函数,然后按下按钮 – 并接收一些输出数据。 计算可能需要几分钟或几小时,因此不能接受仅限Numpy的性能。 我尝试了以下方法:基于Python的UI调用gcc,从用户函数编译dll,这是我在Cython包装中使用的基于C的核心算法所使用的。 它工作,但由于没有办法完全卸载python模块,我不能重新编译用户定义的函数,直到整个UI程序关闭并再次运行。 我现在看到的唯一方法是分离计算核心和UI进程,然后通过共享内存/消息传递使它们进行交互。 当用户想要更新他的function时,程序终止核心,重新编译DLL并再次启动核心。 在这种情况下你能建议任何常见做法吗? 谢谢!

用于C / C ++的JIT优化器

我正在阅读有关JIT优于预编译的优点,其中之一是JIT可以根据实际运行时数据调整分支预测。 现在我在大学写一个编译器已经很久了,但在我看来,在大多数情况下(没有明确的getos),预编译代码也可以实现类似的东西。 请考虑以下代码: test x jne L2: L1: … jmp L3: L2: … L3: 如果我们有一些运行时检测可以看到’jne L2’为真的次数,它可以物理地交换L1:block和L2:block中的所有指令。 当然,它必须知道交换期间任何一个块都没有线程,但这些都是细节…… test x jeq L1: L2: … jmp L3: L1: … L3: 我知道程序代码加载到只读内存等时也存在问题,但这是一个想法。 所以我的问题是,这样的JIT优化是否适用于C / C ++,还是我错过了一些无法做到这一点的根本原因? 那里有C / C ++的JIT优化器吗?

如何在执行期间编译C代码,并获得指向相应函数的指针?

假设我在执行期间生成了一个C程序: source = “int add_x_y(int x, int y){ return x + y; }”; source_size = 42; 我想要以下function: void* compile(char* source, int source_size); 这样: int (*f)(int,int) = compile(source, source_size); printf(“%d\n”,f(2,3)); 输出: 5 compile不能依赖于外部工具(编译器),因为我想在emscripten(将C程序转换为.js文件)中使用它。 那可能吗?

在C中运行时生成函数

我想在C中运行时生成一个函数。我的意思是我本来想分配一些内存,指向它并通过函数指针执行它。 我意识到这是一个非常复杂的话题,我的问题是天真的。 我也意识到有一些非常强大的库可以做到这一点(例如nanojit )。 但我想从基础知识开始学习这项技术。 知识渊博的人能否在C中给我一个非常简单的例子? 编辑: 下面的答案是伟大的,但这是Windows的相同示例: #include #define MEMSIZE 100*1024*1024 typedef void (*func_t)(void); int main() { HANDLE proc = GetCurrentProcess(); LPVOID p = VirtualAlloc( NULL, MEMSIZE, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); func_t func = (func_t)p; PDWORD code = (PDWORD)p; code[0] = 0xC3; // ret if(FlushInstructionCache( proc, NULL, 0)) { func(); } CloseHandle(proc); VirtualFree(p, 0, MEM_RELEASE); return […]