我想知道在虚拟化设置中会有什么样的性能影响数值计算?更具体地说,在相当快的 x86_64 多核机器上,在虚拟化 Windows 操作系统中运行受 CPU 限制的 C++ 代码,而不是在本机 Linux 操作系统中,我会期望什么样的性能损失?
我很乐意根据需要添加精度,但由于我对虚拟化了解不多,我不知道哪些信息是相关的。
我想知道在虚拟化设置中会有什么样的性能影响数值计算?更具体地说,在相当快的 x86_64 多核机器上,在虚拟化 Windows 操作系统中运行受 CPU 限制的 C++ 代码,而不是在本机 Linux 操作系统中,我会期望什么样的性能损失?
我很乐意根据需要添加精度,但由于我对虚拟化了解不多,我不知道哪些信息是相关的。
进程只是一堆线程,它们是以顺序方式执行的指令流。在现代虚拟化解决方案中,就 CPU 而言,主机和客户进程一起执行,不同之处仅在于后者的 I/O 被捕获和虚拟化。内存也是虚拟化的,但这或多或少发生在硬件 MMU 中。来宾指令由 CPU 直接执行,否则它将不是虚拟化而是仿真,只要它们不访问任何虚拟化资源,它们的执行速度就会与主机指令一样快。最后,这一切都取决于 CPU 能够如何应对不断增加的正在运行的进程。
有一些轻量级的虚拟化解决方案,如 Solaris 中的区域,它对进程空间进行分区,以呈现操作系统的多个副本,但这一切都发生在单个操作系统内核的保护伞下。
纯计算代码的性能损失非常小,通常低于 1-2%。问题在于,实际上所有程序都读取和写入数据,而计算代码通常会读取和写入大量数据。即使使用英特尔 VT-* 或 AMD-V 等解决方案,虚拟化 I/O 通常也比直接 I/O 慢得多。
确切的数字很大程度上取决于特定的硬件。
受到@Mitch Wheat 无可争辩的断言的刺激,即我在这里的原始帖子不是答案,这里尝试将其改写为答案:
我主要从事能源领域的高性能计算。我的科学家同事运行的一些计算需要 O(10^5) CPU 小时,我们正在认真考虑在不久的将来 O(10^6) CPU 小时的工作。
从我们的代码中榨取每一滴性能,我得到了丰厚的报酬,如果我能将我们的一些程序的运行时间缩短 1%,我认为这是一天的好工作。有时我需要一个月的时间才能获得这种性能改进,当然我可能会很慢,但对我们的科学家来说仍然具有成本效益。
因此,当聪明的销售人员提供最新最好的数据中心软件(虚拟化是其中一个方面)时,我不寒而栗,在我看来,这些软件只会将我的代码束缚在 250,00dwt 油轮上的一堆锚链上(即是一个比喻)。
我已经仔细阅读了这个问题,并理解 OP 并没有提出虚拟化会有所帮助,我提供的是从业者的观点。如果这仍然是过多的评论,请执行 SO 并投票关闭,我保证不会被冒犯!