关于优化:术语“CPU绑定”和“I / O绑定”是什么意思?

What do the terms “CPU bound” and “I/O bound” mean?

术语"CPU绑定"和"I/O绑定"是什么意思?


这很直观:

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

如果程序在I/O子系统更快的情况下运行得更快,那么它就是I/O绑定的。确切的I/O系统的含义可能有所不同;我通常将其与磁盘相关联,但当然,一般来说,网络或通信也很常见。在一个巨大的文件中查找某些数据的程序可能会成为I/O绑定的,因为瓶颈是从磁盘读取数据(实际上,这个例子现在可能有点过时了,有数百MB/s来自SSD)。


CPU-bound是指进程进程的速度受CPU速度的限制。对一小组数字执行计算的任务,例如乘法小矩阵,可能受CPU限制。

I/O界限是指进程进程的速度受I/O子系统速度的限制。例如,处理来自磁盘的数据的任务(计算文件中的行数)可能是I/O绑定的。

内存限制是指进程进程进程的速度受到可用内存量和内存访问速度的限制。处理大量内存数据的任务(例如乘以大型矩阵)可能是内存绑定的。

缓存绑定是指进程进度受可用缓存的数量和速度限制的速率。只处理超过缓存容量的数据的任务将被缓存绑定。

I/O绑定比内存绑定慢,而缓存绑定比CPU绑定慢。

I/O绑定的解决方案不一定要获得更多内存。在某些情况下,可以围绕I/O、内存或缓存限制设计访问算法。请参见缓存遗忘算法。


多线程是一种区别很重要的情况,如下面的示例所述。好的。

RAM I/O绑定示例:矢量和好的。

考虑一个程序,它对单个向量的所有值求和:好的。

1
2
3
4
5
6
7
#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]

在普通的现代桌面上,通过平均地为每个核心划分数组来并行化这一点的用处是有限的。C++基准测试在:HTTPS://Github. CO/CySoRoStRILIL/算法CHIAT/BUB/EA16F6BA12DCCF32 C0CBBCDCCD7BC2FD2D05B/SRC/CPP/交互性/SUMIGARARYAULIP.CPP好的。

在GCC 5.2.1、Ubuntu 15.10和4核Intel i5-3210M、联想t430上测试。典型结果示例(多线程后的变量):好的。

1
2
3
4
5
6
7
8
9
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个线程的计算速度没有预期的快4倍!好的。

原因是所有处理器共享一条连接到RAM的内存总线:好的。

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

因此,内存总线很快成为瓶颈,而不是CPU。好的。

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

所以每字节输入数据的CPU工作太小,我们称之为IO绑定进程。好的。

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

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

其他例子好的。

  • 矩阵乘法是RAM和GPU上的CPU绑定。输入内容包括:好的。

    1
    2 * N**2

    数字,但是:好的。

    1
    N ** 3

    进行了乘法运算,这足以使并行化对于实际的大N值是值得的。好的。

    这就是图书馆喜欢的原因:好的。

    • http://www.netlib.org/scalapack/pblas_qref.html
    • http://icl.cs.utk.edu/magma/software/软件/

    存在。好的。

    缓存的使用对实现速度有很大影响。请参阅这个教学GPU比较示例。好的。

  • GPU在向CPU传输数据时存在IO瓶颈。好的。

    它们的设计使得渲染输出(像素的矩形)可以直接输出到视频内存,以避免CPU往返。好的。

  • 网络是典型的IO绑定示例。好的。

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

    并行处理小型网络请求(如HTTP请求)可以提供巨大的性能提升。好的。

    如果网络已经满负荷运行(例如下载Torrent),并行化仍然可以提高延迟(例如,您可以"同时"加载网页)。好的。

  • 一个虚拟的C++ CPU绑定的操作,需要一个数字,并对它进行大量压缩:好的。

    • 系列
    • 平行

如何确定您是否受CPU或IO限制好的。

非RAM IO绑定,如磁盘,网络:ps aux,然后如果CPU% / 100 < n threads。如果是,您是IO绑定的,例如阻塞reads只是在等待数据,调度程序跳过该进程。然后使用更多的工具,如sudo iotop来确定哪个IO是问题所在。好的。

或者,如果执行速度很快,并且参数化了线程数,那么从time可以很容易地看出,随着CPU绑定工作线程数的增加,性能会提高:时间输出中的"real"、"user"和"sys"是什么意思(1)?好的。

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

参见:好的。

  • 如何检查应用程序是CPU绑定还是内存绑定?
  • https://askubuntu.com/questions/1540/how-can-i-find-out-if-a-process-is-cpu-memory-or-disk-bound
  • https://askubuntu.com/questions/1540/how-can-i-find-out-if-a-process-is-cpu-memory-or-disk-bound

CPython Global Intelpreter锁(GIL)好的。

作为一个快速的案例研究,我想指出python全局解释器锁(gil):cpython中的全局解释器锁(gil)是什么?好的。

这个cpython实现细节防止多个python线程有效地使用CPU绑定的工作。塞顿医生说:好的。

CPython implementation detail: In CPython, due to the Global Interpreter Lock, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing or concurrent.futures.ProcessPoolExecutor. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously.

Ok.

因此,这里我们有一个示例,其中CPU绑定内容不合适,I/O绑定。好的。好啊。


CPU绑定是指程序受到CPU或中央处理器的瓶颈,而I/O绑定是指程序受到I/O或输入/输出的瓶颈,如读写磁盘、网络等。

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

[我所说的"瓶颈",是指使您的程序运行速度比其他程序慢的事情。]


用另一种方法表达同样的想法:

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

  • 如果加速I/O(例如使用更快的磁盘)没有帮助,您的程序可能会受到CPU限制。

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


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

如果您的程序正在运行大量的程序指令,并且不等待I/O,那么它就被称为CPU绑定的。加速CPU将使程序运行得更快。

在这两种情况下,加速程序的关键可能不是加快硬件速度,而是优化程序以减少所需的IO或CPU数量,或者让它在做I/O的同时做CPU密集型工作。


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

这与受CPU限制的任务相反。当请求数据的速度比消耗数据的速度慢时,或者换句话说,请求数据的时间比处理数据的时间长时,就会出现这种情况。


IO绑定进程:花费更多的时间进行IO而不是计算,有很多短CPU脉冲。CPU绑定进程:花费更多的时间进行计算,很少有非常长的CPU突发


I/O绑定进程:-如果进程生命周期的大部分时间都处于I/O状态,则该进程是I/O绑定进程。示例:-计算器,Internet Explorer

CPU绑定进程:如果进程生命的大部分时间都花在CPU上,那么它就是CPU绑定进程。