让我们看一个琐碎的 CPU 绑定程序,例如暴力破解素数,它可能偶尔会将它们保存到 SD 卡中。
今天的程序效率低下包括解释和虚拟机等。所以为了速度,让我们把它们扔掉,并使用编译语言。
现在,虽然我们现在拥有可以直接在处理器上运行的代码,但我们仍然拥有操作系统,它将在不同进程之间多路复用、运行自己的代码、管理内存以及做其他会减慢程序执行速度的事情。
如果我们要编写自己的操作系统来单独运行我们的程序,我们可以期望看到什么加速因素?
我确信可能有许多变量,所以如果你愿意,请详细说明。
让我们看一个琐碎的 CPU 绑定程序,例如暴力破解素数,它可能偶尔会将它们保存到 SD 卡中。
今天的程序效率低下包括解释和虚拟机等。所以为了速度,让我们把它们扔掉,并使用编译语言。
现在,虽然我们现在拥有可以直接在处理器上运行的代码,但我们仍然拥有操作系统,它将在不同进程之间多路复用、运行自己的代码、管理内存以及做其他会减慢程序执行速度的事情。
如果我们要编写自己的操作系统来单独运行我们的程序,我们可以期望看到什么加速因素?
我确信可能有许多变量,所以如果你愿意,请详细说明。
看看 Return Infinity http://www.returninfinity.com/的产品(我不以任何方式加入),并进行实验。
我自己的超级计算经验表明,跳过 TLB(几乎完全),通过运行平面内存模型,再加上内核和用户空间之间缺乏上下文切换,可以而且确实加速了一些任务——尤其是那些与网络中的消息传递相关的任务(MAC级别,甚至不是 TCP,为什么要打扰),以及蛮力计算(由于缺乏内存管理)。
在超过 TLB 或缓存大小的蛮力计算中,与必须进行基于 RAM 的转换表查找相比,您可以预期大约 5-15% 的性能提升 - 代价是每个软件错误都完全不受保护(您可以锁定一些静态页面与整体链接,你)。
在高带宽工作中,尤其是在有大量小消息传递的情况下,您可以通过进入内核空间轻松获得 500% 的加速,或者通过完全删除(多任务)操作系统,或者通过将应用程序加载为内核驱动程序,也绕过了整个抽象。我们已经能够将 MAC 层 ping 的网络延迟从 18us 降低到 1.3us。
在适合 L1 缓存的计算上,我预计改进最小(大约 1%)。
这一切都重要吗?是和不是。如果您的硬件成本大大超过您的工程成本,并且您已经完成了您能想到的所有算法改进(更好的是,证明完成的计算正是结果所需的计算!) - 这可以带来有意义的性能优势。在电力成本约为 800 万美元/年的超级计算机上,额外 3%(总体平均成功率),不包括硬件摊销,价值 24,000 美元/年。足以支付工程师一个月的费用来优化它运行的最常见任务:)。
假设您正在运行一台体面的机器并且操作系统没有做太多其他事情:这不是一个大因素,我预计不到 10% 的改进。
只是操作系统“空闲”不会(不应该)占用 CPU 的大部分处理能力。如果是,您需要更好的机器、更好的操作系统、格式或这些的某种组合。
另一方面,如果您正在运行一堆其他资源密集型的东西,显然可以期望通过不运行其他东西来加快速度。
如果您不是超级用户,您可能会惊讶地发现有大量(非操作系统)进程在后台运行,这些进程更有可能占用操作系统的 CPU 处理能力。
稍微偏离主题但相关,请记住,如果您正在运行 8 个内核,那么在完美的世界中,您可以通过多线程将处理速度提高 8 倍。
期望从已知解决方案到问题的更大改进,更好地利用数据结构和算法,以及在较小程度上,语言和微优化的选择。
根据我的经验:
不是最科学或最可靠的结果,但大多数时候当我在 Windows 上打开任务管理器时,所有操作系统进程都低于 CPU 的 1%。