我正在考虑使用sse2内部函数对一些floor()调用进行向量化,然后测量性能增益。但最终二进制文件将在我无法访问的虚拟机上运行。
我真的不知道VM是如何工作的。二进制文件是否完全在软件模拟的虚拟CPU上执行?
如果没有,假设VM在带有SSE2的cpu上运行,那么当从我的二进制文件执行SSE2指令时,VM是否可以使用他的cpu SSE2指令?
我的矢量化能否对VM有益?
答案 0 :(得分:4)
我真的不知道VM是如何工作的。二进制文件是否完全在软件模拟的虚拟CPU上执行?
出于严肃的目的,不,因为它太慢了。 (但是例如Bochs会这样做;它可以用于内核调试等)
二进制文件尽可能“正常”执行。这通常意味着任何不尝试与OS交互的代码都将直接执行。例如,系统调用可能需要VM实现的参与。
如果没有,假设VM在带有SSE2的cpu上运行,那么当从我的二进制文件执行SSE2指令时,VM是否可以使用他的cpu SSE2指令?
是
我的矢量化能否对VM有益?
是
答案 1 :(得分:3)
取决于VM技术和CPU功能。第一个x86虚拟机(如32位计算机上的VMWare)使用重新编译。他们查看VM的二进制代码以寻找有害指令(如访问原始内存或特殊寄存器)以用超级调用替换它们。
由于SSE2指令无害,因此它们将保持原样,并且VM中不会增加性能损失。而且,现代x86 CPU使用"硬件虚拟化"这允许避免重新编译。 CPU捕获有害指令并产生中断,但SSE2 instrs不应该触发它。
当然有完整的处理器模拟器,如QEMU(不是QEMU-KVM)或Bochs,但它是一个不同的故事。例如,Bochs仿真的CPU比主机CPU慢大约1000倍。