Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc编译(有时)会导致cpu负载不足 我有一个较大的C++程序,它是通过读取成千上万个小文本文件到内存中并在STL容器中存储数据开始的。这大约需要一分钟。编译将周期性地显示程序的初始部分将以大约22-23%的CPU负载运行的行为。一旦该步骤结束,它将返回到~100%CPU。当O2标志打开时,更可能发生这种情况,但不一致。使用-p标志时,这种情况更不常见,这使得几乎不可能分析。我确实捕获过一次,但是gprof输出没有帮助——所有东西都以相同的相对速度运行,只是cpu使用率很低_C++_Linux_Gcc_Cpu Usage - Fatal编程技术网

gcc编译(有时)会导致cpu负载不足 我有一个较大的C++程序,它是通过读取成千上万个小文本文件到内存中并在STL容器中存储数据开始的。这大约需要一分钟。编译将周期性地显示程序的初始部分将以大约22-23%的CPU负载运行的行为。一旦该步骤结束,它将返回到~100%CPU。当O2标志打开时,更可能发生这种情况,但不一致。使用-p标志时,这种情况更不常见,这使得几乎不可能分析。我确实捕获过一次,但是gprof输出没有帮助——所有东西都以相同的相对速度运行,只是cpu使用率很低

gcc编译(有时)会导致cpu负载不足 我有一个较大的C++程序,它是通过读取成千上万个小文本文件到内存中并在STL容器中存储数据开始的。这大约需要一分钟。编译将周期性地显示程序的初始部分将以大约22-23%的CPU负载运行的行为。一旦该步骤结束,它将返回到~100%CPU。当O2标志打开时,更可能发生这种情况,但不一致。使用-p标志时,这种情况更不常见,这使得几乎不可能分析。我确实捕获过一次,但是gprof输出没有帮助——所有东西都以相同的相对速度运行,只是cpu使用率很低,c++,linux,gcc,cpu-usage,C++,Linux,Gcc,Cpu Usage,我很确定这与多核无关。我有一个四核cpu,大部分代码都是多线程的,但我在单线程上测试了这个问题。另外,当我在多个线程中运行有问题的步骤时,每个线程只运行约20%的CPU 我为这个问题的模糊性提前道歉,但是我已经没有办法进一步解决这个问题了,所以任何提示都可能有帮助 更新:为了确保清楚起见,代码中有问题的部分有时(约30-40%的编译)运行在100%的CPU上,因此很难相信I/O是瓶颈这一(其他合理的)论据,因为您正在读取大量小文件,所以您的程序在大多数时间都被阻止在磁盘上等待I/O。由于CPU在

我很确定这与多核无关。我有一个四核cpu,大部分代码都是多线程的,但我在单线程上测试了这个问题。另外,当我在多个线程中运行有问题的步骤时,每个线程只运行约20%的CPU

我为这个问题的模糊性提前道歉,但是我已经没有办法进一步解决这个问题了,所以任何提示都可能有帮助


更新:为了确保清楚起见,代码中有问题的部分有时(约30-40%的编译)运行在100%的CPU上,因此很难相信I/O是瓶颈这一(其他合理的)论据,因为您正在读取大量小文件,所以您的程序在大多数时间都被阻止在磁盘上等待I/O。由于CPU在等待磁盘将数据发送给它时并不繁忙,因此您看到的负载明显低于100%。一旦这一切结束,现在您就受到CPU的限制,您的程序将占用所有可用的CPU时间

事实上,它有时工作得更快是因为(正如Jarryd&DigitalRoss所提到的)一旦您将它们读入系统内存,它们就在操作系统的缓存中,因此后续加载速度会快一个数量级,除非它们被其他磁盘I/O逐出。因此,如果您背靠背运行程序,第二次运行可能会快得多。如果您等待一段时间(同时执行其他操作),可能有足够的其他磁盘I/O将这些文件从缓存中移出,在这种情况下,重新读取这些文件将需要很长时间。

这是缓冲缓存
我的猜测是,你看到的是正在运作的结果

这数千个文件需要很长时间才能从磁盘读入,CPU将主要等待旋转和寻道延迟。报告的CPU使用时间将以百分比表示。(但总体而言可能更大。)

但一旦读取,这些小文件就完全缓存在内存中,访问每个文件(在后续运行中)就变成了一个纯粹的CPU限制活动


块是否保留在缓存中取决于干预活动,如重新编译。当运行新程序并读取其他文件时,程序和文件将被缓存,旧块将被删除,显然,内存密集型工作负载也会清除缓冲区缓存。

除了提到缓冲区缓存的其他答案外,如果您想了解编译过程中发生的情况,您可以将以下部分内容传递给GCC(即传递给
g++
,可能作为
Makefile
中的
cxflags
设置):

    <>代码> -v>代码>,请参阅<代码> g++<代码>,以显示相关子过程(例如,C++代码编译器的代码> cc1Pule<代码>)
  • -time
    要求
    g++
    报告每个子进程的时间
  • -ftime report
    要求
    g++
    (实际上是
    cc1plus
    )报告编译器内部阶段或过程的时间

读取文件不需要整个CPU,因为在第一部分它是IO绑定的?可能有时候文件系统正忙于做其他事情,因此会减慢程序的速度。确保所有文件都是本地文件,并且操作系统不会开始进行内部管理。这意味着您的CPU处理文件的速度比磁盘子系统读取磁盘的速度快。如果不分析,您所能做的就是猜测。一个好的猜测是IO。你可能不应该在没有真正分析的情况下取消这种可能性。请参阅以获取一些工具建议。要验证此假设,请将文件放在闪存驱动器上,然后查看问题是否会得到改善。如果是的话,是时候购买SSD了。然后在其他运行中,它不会被延迟,因为这些文件现在在内存中,不必再从磁盘上读取。@markransem-嗯,也许吧。如果它是一个快速闪存驱动器&它在一个快速总线上。我有一些旧的1G USB1.0 thumb硬盘,甚至比一个慢的硬盘都慢。如果块是从上一次运行中缓存的,它会以100%的速度运行。请阅读我以前的评论。一旦数据被读入,I/O瓶颈有时不会发生,因为操作系统保留了硬盘数据的缓存。是的,你们完全正确。我通过在相同编译的两次运行之间清除缓存来测试它。堆积如山的岩石@confusedCoder-我很好奇,你是如何在两次运行之间清除缓存的?@phonetagger
sync;echo 3>/proc/sys/vm/drop_缓存
,如下所述