为什么不在conda环境中混合arm/intel



许多问题询问如何让M1/M2苹果硅Mac安装纯英特尔或纯arm conda环境。

关于如何实现这两种配置,有很好的答案。

经过广泛的搜索,我在任何地方都没有看到答案的问题是,为什么不可能在一个环境中混合架构。

这是动态加载库(DLL(地狱的一个例子吗?

如果我只是想混合二进制文件,应该没有问题。

我应该能够使用性能更高的体系结构。Rosetta 2应该在二进制体系结构的基础上进行仿真。

在依赖链中,问题出现在哪里?我可以忽略这些警告,仍然安装混合包,希望它们表现得像单独的二进制文件吗?

是的,您可以启动另一个体系结构的单独进程,并通过管道甚至共享内存与之对话。但不要打电话到图书馆。

这方面没有调用约定,也没有办法弄清楚哪些x86寄存器在从ARM64代码跳转或调用后应该得到什么值,反之亦然。(在一般情况下,对于可变函数来说,这可能是一个无法解决的问题,对于x86-64 System V,我认为在寄存器中传递的FP参数比ARM64多,并且你不知道在蹦床/垫片/包装器中加载哪个堆栈参数到FP寄存器中,该包装器会尝试在它们之间进行调整,如果这有意义的话,因为被调用方也是刚刚从编译的本机ARM64代码x86-64机器代码。您实际上没有x86-64寄存器,尽管ARM64确实有更多与整数和矢量寄存器宽度相同的寄存器,Rosetta-2支持(而不是AVX(

仿真是在整个进程级别上进行的,用于整个进程的所有虚拟地址空间。不在每个函数级别上将单个函数移植到标准ARM64调用约定。不同的ABI(类型的大小和对齐,以及结构布局(也是一个问题。

如果Rosetta-2没有完全提前重新编译,也就是说,如果有任何运行时组件,比如JVM JIT如何编译,但仍然在VM内运行代码,那么当从ARM64进程调用x86-64函数时,也必须启动它。

最新更新