sse2 向量化和虚拟机

sse2 vectorization and virtual machines

我正在考虑使用 sse2 内在函数向量化一些 floor() 调用,然后测量性能增益。但最终二进制文件将 运行 在我无法访问的虚拟机上。

我真的不知道 VM 是如何工作的。二进制文件是否完全在软件模拟的虚拟机上执行 cpu ?

如果不是,假设 VM 运行 在 cpu 上使用 SSE2,当从我的二进制文件执行 SSE2 指令时,VM 可以使用他的 cpu SSE2 指令吗?

我的矢量化对 VM 有好处吗?

I don't really know how a VM works. Is a binary entirely executed on a software-emulated virtual cpu?

出于严肃的目的,不,因为它太慢了。 (但例如 Bochs 确实如此;它对内核调试等很有用)

尽可能多地执行二进制文件"normally"。这通常意味着任何不尝试与 OS 交互的代码都将被直接执行。例如,系统调用很可能需要 VM 实现的参与。

If not, supposing the VM is run on a cpu with SSE2, could the VM use his cpu SSE2 instruction when executing a SSE2 instruction from my binary?

是的。

Could my vectorization be beneficial on the VM?

是的。

取决于 VM 技术和 CPU 功能。第一个 x86 虚拟机(如 32 位机器上的 VMWare)使用 重新编译。他们研究了 VM 的二进制代码以寻找有害指令(如访问原始内存或特殊寄存器)以将其替换为 hyper-calls。

由于 SSE2 指令无害,它们将保持原样,并且不会在 VM 中增加性能损失。此外,现代 x86 CPUs 使用 "hardware virtualization" 可以避免重新编译。 CPU 捕获有害指令并生成中断,但 SSE2 指令同样不应触发它。

当然有像 QEMU(不是 QEMU-KVM)或 Bochs 这样的全处理器模拟器,但这是另一回事。例如,Bochs-emulated CPU 比主机 CPU.

慢大约 1000 倍