Optimization 术语是什么;“CPU绑定”;及;“I/O绑定”;什么意思?

Optimization 术语是什么;“CPU绑定”;及;“I/O绑定”;什么意思?,optimization,terminology,Optimization,Terminology,术语“CPU绑定”和“I/O绑定”是什么意思?非常直观: 如果一个程序在CPU更快的情况下运行得更快,则该程序受CPU限制,也就是说,它将大部分时间用于简单使用CPU(进行计算)。计算π的新数字的程序通常会受到CPU的限制,它只是处理数字 如果I/O子系统速度更快,程序运行速度更快,则程序受I/O限制。具体的I/O系统可能会有所不同;我通常把它与磁盘联系起来,但当然,网络或通信也很普遍。在一个大文件中查找某些数据的程序可能会受到I/O限制,因为瓶颈是从磁盘读取数据(实际上,这个例子现在可能有点过

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

非常直观:

如果一个程序在CPU更快的情况下运行得更快,则该程序受CPU限制,也就是说,它将大部分时间用于简单使用CPU(进行计算)。计算π的新数字的程序通常会受到CPU的限制,它只是处理数字


如果I/O子系统速度更快,程序运行速度更快,则程序受I/O限制。具体的I/O系统可能会有所不同;我通常把它与磁盘联系起来,但当然,网络或通信也很普遍。在一个大文件中查找某些数据的程序可能会受到I/O限制,因为瓶颈是从磁盘读取数据(实际上,这个例子现在可能有点过时,从SSD输入数百MB/s)。

CPU限制意味着程序受到CPU或中央处理单元的限制,而绑定意味着程序受到I/O或输入/输出的限制,如读写磁盘、网络等

一般来说,在优化计算机程序时,人们试图找出瓶颈并消除它。知道您的程序受CPU限制会有所帮助,这样您就不会不必要地优化其他程序


[所谓“瓶颈”,我指的是使您的程序运行速度比其他程序慢的东西。]

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

如果您的程序正在运行大量的程序指令,并且没有等待I/O,则称其为CPU受限。加速CPU将使程序运行得更快


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

表达相同想法的另一种方式:

  • 如果加快CPU的速度并不能加快程序的速度,那么它可能会被绑定

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


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

CPU绑定表示进程的进度受到CPU速度的限制。对一小组数字执行计算的任务(例如乘以小矩阵)可能会受到CPU的限制

I/O界限表示进程的进度受I/O子系统速度的限制。处理磁盘数据的任务(例如,计算文件中的行数)可能会受到I/O限制

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

缓存绑定指进程进度受可用缓存数量和速度限制的速率。如果任务处理的数据超过缓存中的数据量,则该任务将被绑定到缓存

I/O绑定速度将低于内存绑定速度将低于缓存绑定速度将低于CPU绑定速度


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

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


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

I/O绑定指的是一种情况,在这种情况下,完成计算所需的时间主要取决于等待输入/输出操作完成的时间


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

IO绑定进程:执行IO的时间比计算的时间多,有很多 短CPU突发。
CPU占用的进程:花更多的时间进行计算,很少有很长的CPU突发

多线程是最重要的

在这个答案中,我将研究一个区分CPU和IO有界工作的重要用例:编写多线程代码时

RAM I/O绑定示例:向量和

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

#define SIZE 1000000000
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]
因此,内存总线很快成为瓶颈,而不是CPU

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

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

进一步加快计算速度的唯一方法是使用新的内存硬件加速单个内存访问,例如

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

其他示例

  • 矩阵乘法是RAM和GPU上的CPU限制。输入包括:

    2 * N**2
    
    数字,但:

    N ** 3
    
    乘法已经完成,这足以使并行化对于实际的大型N

    这就是存在如下并行CPU矩阵乘法库的原因:

    缓存的使用对实现速度有很大影响。寻找
    N ** 3
    
    Workload Name                                     (iter/s)   (iter/s)    Scaling
    ----------------------------------------------- ---------- ---------- ----------
    cjpeg-rose7-preset                                  526.32     178.57       2.95
    core                                                  7.39       2.16       3.42
    linear_alg-mid-100x100-sp                           684.93     238.10       2.88
    loops-all-mid-10k-sp                                 27.65       7.80       3.54
    nnet_test                                            32.79      10.57       3.10
    parser-125k                                          71.43      25.00       2.86
    radix2-big-64k                                     2320.19     623.44       3.72
    sha-test                                            555.56     227.27       2.44
    zip-test                                            363.64     166.67       2.18
    
    MARK RESULTS TABLE
    
    Mark Name                                        MultiCore SingleCore    Scaling
    ----------------------------------------------- ---------- ---------- ----------
    CoreMark-PRO                                      18743.79    6306.76       2.97
    
    private readonly HttpClient _httpClient = new HttpClient();
    
    downloadButton.Clicked += async (o, e) =>
    {
        // This line will yield control to the UI as the request
        // from the web service is happening.
        //
        // The UI thread is now free to perform other work.
        var stringData = await _httpClient.GetStringAsync(URL);
        DoSomethingWithData(stringData);
    };
    
    private DamageResult CalculateDamageDone()
    {
        // Code omitted:
        //
        // Does an expensive calculation and returns
        // the result of that calculation.
    }
    
    calculateButton.Clicked += async (o, e) =>
    {
        // This line will yield control to the UI while CalculateDamageDone()
        // performs its work.  The UI thread is free to perform other work.
        var damageResult = await Task.Run(() => CalculateDamageDone());
        DisplayDamage(damageResult);
    };