我有一个带有opencv库的c ++程序,它将图像作为输入并执行姿势估计,颜色检测,phog。当我从命令行运行此程序时,需要大约4-5秒才能完成。它需要大约60%的CPU。当我尝试从两个不同的命令行窗口同时运行相同的程序时,该过程大约需要10-15秒完成,并且该过程几乎在同一时间内完成。 CPU使用率达到100%。
我有一个使用exec()命令调用此c ++ exe的网站。因此,当两个用户尝试上传图像并运行时,如上所述在命令行中需要更多时间。这是因为c ++程序涉及高计算且CPU达到100%会减慢吗?但我读到CPU达到100%并不是坏事,因为计算机正在使用其全部容量来运行程序。这是因为我的c ++程序还是与我的服务器(计算机)设置有关?这可能不是apache服务器问题,因为当我尝试从命令行运行它时它也会减慢速度。我正在使用四核处理器,当我尝试同时运行相同的进程时,所有4个CPU达到100%所以我认为它分布在所有处理器中。所以我还有几个问题:
1)这可以通过在我的c ++代码中使用多线程来解决吗?至于现在我没有使用它,但多线程会使c ++代码的计算成本更高并且增加CPU使用率(如果这是问题)。
2)减速的原因是什么?进程是否在队列中并且每个进程只运行了一定的时间并且它在两个进程之间切换?
3)如果这是因为它涉及高计算,如果我将一些函数更改为opencv gpu函数会有帮助吗?
4)有没有办法可以解决这个问题的任何想法或提示?
我在运行一个进程时插入了top的结果并同时运行了两次相同的进程:
Version5是进程,运行一次 两个Version5同时运行
CPU信息:
提前致谢。
答案 0 :(得分:2)
在缩放以使你的图片几乎填满我的整个22英寸屏幕后,我可以看出CPU标志显示“ht”,这意味着“超线程”,所以你实际上只有两个真正的核心,它们在两个之间共享因此,在所有四个CPU核心上同时运行将无法提供与在两个真正核心上运行相同的性能。
换句话说,“性能损失”完全如您所期望的那样,因为您有四个线程争夺两个CPU核心的实际计算资源。超线程有助于代码具有大量内存交互,可以通过运行第二个线程来“隐藏”。但是如果你有一个CPU密集型代码,那就不是“在缓存中”丢失很多,那么增益就会少得多,而在极端情况下,超线程实际上会导致速度减慢(因为一个线程中的代码会破坏缓存)否则“妨碍”第一个线程)。您可能希望通过进入BIOS设置并关闭超线程来进行实验,并比较结果。当然,运行两个代码实例显然仍需要更长时间,但问题是“它是否比超线程运行更长” - 不幸的是,从理论角度来看,不可能确定哪个更好(即使我能看到汇编代码并理解内存访问模式 - 如果没有那么详细的细节,就完全不可能判断。
答案 1 :(得分:1)
格尔茨