“CPU绑定”和“I / O绑定”是什么意思?

“CPU绑定”和“I / O绑定”是什么意思?

这很直观:

如果CPU速度更快,程序就会受到CPU的限制,也就是说,大部分时间只是使用CPU(进行计算)。 一个计算π的新数字的程序通常会受到CPU限制,这只是计算数字。

如果I / O子系统速度更快,程序将会更快。 确切的I / O系统意味着可能会有所不同; 我通常将它与磁盘相关联。 通过一个巨大的文件查看某些数据的程序通常会被I / O限制,因为瓶颈是从磁盘读取数据。

CPU绑定意味着进程的速度受到CPU速度的限制。 对一小组数字执行计算的任务,例如乘以小matrix,可能会受CPU限制。

I / O绑定意味着进程的进展速度受到I / O子系统速度的限制。 从磁盘处理数据的任务(例如,计算文件中的行数)可能是I / O限制的。

内存绑定意味着进程的进展速度受到可用内存量和内存访问速度的限制。 处理大量内存数据的任务,例如乘以大型matrix,可能是内存绑定。

高速caching绑定意味着进程进度的速度受限于可用高速caching的数量和速度。 简单地处理更多数据而不是适合caching的任务将被caching绑定。

I / O绑定将比内存绑定更慢比caching绑定将比CPU绑定更慢。

被I / O绑定的解决scheme不一定要获得更多的内存。 在某些情况下,访问algorithm可以围绕I / O,内存或高速caching限制进行devise。 请参阅caching不经意algorithm 。

CPU绑定意味着程序受到CPU或中央处理器的瓶颈,而I / O绑定则意味着程序受到I / O或input/输出(如读写磁盘,networking等)的瓶颈。

一般来说,在优化计算机程序时,试图找出瓶颈并将其消除。 知道你的程序是CPU绑定的帮助,这样就不会不必要地优化别的东西。

[通过“瓶颈”,我的意思是让你的程序比其他方式慢下来。

multithreading是下面的例子所解释的区分问题。

RAM I / O限制示例:向量和

考虑一个总结单个向量的所有值的程序:

#define SIZE 1000000 unsigned int is[SIZE]; unsigned int sum = 0; size_t i = 0; for (i = 0; i < SIZE; i++) /* Each one of those requires a RAM access! */ sum += is[i] 

通过平均分配arrays来平行处理每个核心,对于普通的现代桌面来说是非常有用的。 C ++基准: https : //github.com/cirosantilli/algorithm-cheat/blob/ea16f6bba12e7dcc32c0cbbbcdc74bcc2fd2d05b/src/cpp/interactive/sum_array_parallel.cpp

testing了GCC 5.2.1,Ubuntu 15.10与4核英特尔i5-3210M,联想T430。 典型结果示例(自multithreading以来的variables):

 Time N Threads Comment --------- ---------- -------- 0.045962 none 0.0487619 1 Worse than 0 threads because of startup overhead. 0.0329526 2 0.0302511 3 0.0232993 4 Best time. Only about 2x as fast. 0.0281021 5 Worse than 4 threads because we don't have that many cores, which generate overhead. 

计算速度不如预期的4倍!

所有处理器共享连接到RAM的单个内存总线的原因是:

 CPU 1 --\ Bus +-----+ CPU 2 ---\__________| RAM | CPU 3 ---/ +-----+ CPU 4 --/ 

所以内存总线迅速成为瓶颈,而不是CPU。

发生这种情况是因为添加两个数字需要一个CPU周期,在2016年的硬件中,内存读取大约需要100个CPU周期 。

因此,每个input数据字节所完成的CPU工作量太小,我们称之为一个IO绑定进程。

进一步提高计算速度的唯一方法是使用新的内存硬件(例如多通道内存)加速单个内存访问。

升级到更快的CPU时钟,例如不会很有用。

其他例子

  • matrix乘法在RAM和GPU上受CPU限制。 input包含:

     2 * N**2 

    数字,但是:

     N ** 3 

    乘法运算已经完成,并且足以实现并行化,以便为实际大N值得

    这就是为什么图书馆喜欢:

    存在。

    高速caching的使用对实现的速度有很大的影响。 例如,看这个教学的GPU比较例子 。

  • GPU在将数据传输到CPU时存在IO瓶颈。

    它们的devise使渲染输出(一个像素的矩形)可以直接输出到video存储器,以避免CPU往返。

  • networking是典型的IO界的例子。

    即使我们发送一个字节的数据,它仍然需要很长时间才能到达目的地。

    并行处理像HTTP请求这样的小型networking请求可以带来巨大的性能提升。

    如果networking已经满负荷(例如,下载一个种子),并行化仍然会增加延迟(例如,你可以同时加载一个网页)。

  • 一个虚拟的C ++ CPU绑定操作,它需要一个数字并将其处理很多:

    • 串行
    • 平行

如何找出你是CPU或IO绑定

非内存IO的绑定像磁盘,networking: ps aux ,然后theck如果CPU% / 100 < n threads 。 如果是的话,你是IO绑定,例如阻塞read只是在等待数据,调度器正在跳过这个过程。 然后使用更多的工具,如sudo iotop来确定哪个IO是完全问题。

RAM-IO绑定:很难说,由于RAM等待时间,它包含在CPU%测量中。 也许你能做的最好的是估计caching未命中。

也可以看看:

另一种方式来expression同样的想法:

  • 如果加速CPU不会加速您的程序,则可能是I / O限制。

  • 如果加速I / O(例如使用更快的磁盘)不起作用,那么程序可能会受到CPU的限制。

(我使用“可能是”,因为你需要考虑其他资源,内存就是一个例子。)

当程序正在等待I / O (即磁盘读/写或networking读/写等)时,即使程序停止,CPU也可以自由地执行其他任务。 你的程序的速度将主要取决于IO的发生速度,如果你想加快速度,你将需要加速I / O。

如果你的程序正在运行大量的程序指令而不是等待I / O,那么就说它是CPU绑定的。 加速CPU将使程序运行得更快。

在任何一种情况下,加速程序的关键可能不是加快硬件速度,而是优化程序以减less所需的IO或CPU的数量,或者使其执行I / O,同时也使CPU密集东东。

I / O限制是指完成计算所花费的时间主要由等待input/输出操作完成的时间决定的。

这与CPU绑定的任务是相反的。 这种情况出现在请求数据的速率比它消耗的速率要慢时,换句话说,请求数据花费的时间多于处理数据的速度。

IO绑定进程:比计算花费更多的时间做IO,有许多短的CPU突发。 CPU绑定的进程:花更多时间进行计算,很less有很长的CPU突发

I / O绑定过程: – 如果一个进程的大部分生命周期都花费在I / O状态,那么这个进程就是被限制的进程。例如:-calculator,Internet Explorer

CPU绑定的过程: – 如果大部分进程的生命都花在CPU上,那么这是cpu绑定的过程。