同时多次运行进程 我有一个OpenCV库的C++程序,它以图像作为输入,进行位姿估计、颜色检测、PHOG。当我从命令行运行这个程序时,大约需要4-5秒才能完成。它需要大约60%的cpu。当我试图同时从两个不同的命令行窗口运行同一个程序时,该过程大约需要10-15秒才能完成,并且两个过程几乎同时完成。CPU使用率高达100% 我有一个网站,它使用C++EXE命令调用C++ exe。因此,当两个用户试图上传一个图像并运行时,正如我在上面的命令行中所解释的那样,需要花费更多的时间。这是因为C++程序涉及高计算,CPU达到100%,它减慢了吗?但是我读到CPU达到100%并不是一件坏事,因为计算机正在使用其全部容量来运行程序。这是因为我的C++程序还是与我的服务器(计算机)设置有关?这可能不是apache服务器的问题,因为当我尝试从命令行运行它时,速度也会减慢。我使用的是四核处理器,当我试图同时运行同一个进程时,所有4个CPU都达到100%,所以我认为它分布在所有处理器中。因此,我还有几个问题: < P > 1)这可以通过在我的C++代码中使用多线程来解决吗?因为现在我没有使用它,但是多线程会使C++代码更昂贵,并且增加CPU使用率(如果这是问题)。

同时多次运行进程 我有一个OpenCV库的C++程序,它以图像作为输入,进行位姿估计、颜色检测、PHOG。当我从命令行运行这个程序时,大约需要4-5秒才能完成。它需要大约60%的cpu。当我试图同时从两个不同的命令行窗口运行同一个程序时,该过程大约需要10-15秒才能完成,并且两个过程几乎同时完成。CPU使用率高达100% 我有一个网站,它使用C++EXE命令调用C++ exe。因此,当两个用户试图上传一个图像并运行时,正如我在上面的命令行中所解释的那样,需要花费更多的时间。这是因为C++程序涉及高计算,CPU达到100%,它减慢了吗?但是我读到CPU达到100%并不是一件坏事,因为计算机正在使用其全部容量来运行程序。这是因为我的C++程序还是与我的服务器(计算机)设置有关?这可能不是apache服务器的问题,因为当我尝试从命令行运行它时,速度也会减慢。我使用的是四核处理器,当我试图同时运行同一个进程时,所有4个CPU都达到100%,所以我认为它分布在所有处理器中。因此,我还有几个问题: < P > 1)这可以通过在我的C++代码中使用多线程来解决吗?因为现在我没有使用它,但是多线程会使C++代码更昂贵,并且增加CPU使用率(如果这是问题)。,c++,multithreading,opencv,ubuntu,command-line,C++,Multithreading,Opencv,Ubuntu,Command Line,2) 它减速的原因是什么?进程是否在队列中,并且每个进程只运行一定的时间,并且在两个进程之间切换 3) 如果这是因为它涉及高计算量,那么如果我将一些函数更改为opencv gpu函数,它会有帮助吗 4) 有什么办法可以解决这个问题吗?有什么想法或建议吗 我在同时运行一个进程和两次运行同一进程时插入了top的结果: Version5是流程,只运行一次 两个版本5同时运行 CPU信息: 提前感谢。在放大后,您的图片几乎占据了我整个22英寸的屏幕,我可以看出CPU标志显示“ht”,意思是“超读”,

2) 它减速的原因是什么?进程是否在队列中,并且每个进程只运行一定的时间,并且在两个进程之间切换

3) 如果这是因为它涉及高计算量,那么如果我将一些函数更改为opencv gpu函数,它会有帮助吗

4) 有什么办法可以解决这个问题吗?有什么想法或建议吗

我在同时运行一个进程和两次运行同一进程时插入了top的结果:

Version5是流程,只运行一次 两个版本5同时运行

CPU信息:


提前感谢。

在放大后,您的图片几乎占据了我整个22英寸的屏幕,我可以看出CPU标志显示“ht”,意思是“超读”,所以实际上只有两个真正的内核,在两个超线程之间共享。因此,同时在所有四个CPU内核上运行不会提供与在两个正版内核上运行相同的性能


换句话说,“性能损失”完全如您所料,因为您有四个线程在争夺两个CPU核心的实际计算资源。如果代码有大量的内存交互,而这些交互可以通过运行第二个线程来“隐藏”,那么超线程将很有帮助。但是,如果您有一个CPU密集型代码,“缓存中缺少”的情况并不多,那么增益就会少很多,在极端情况下,超线程实际上会导致速度减慢(因为一个线程中的代码会破坏缓存,否则会“妨碍”第一个线程)。您可能希望通过进入BIOS设置并关闭超线程来进行实验,并比较结果。当然,运行两个代码实例显然仍然需要更长的时间,但问题是“它比使用超线程运行的时间长吗”-不幸的是,从理论角度来说,无法确定哪一个更好(即使我能看到汇编代码并理解内存访问模式——如果没有这种详细程度,也完全无法判断)。

在放大后,您的图片几乎占据了我整个22英寸的屏幕,我可以看出CPU标志显示“ht”,这意味着“超读”,因此实际上只有两个真正的内核,在两个超线程之间共享。因此,同时在所有四个CPU内核上运行不会提供与在两个真正的内核上运行相同的性能


换句话说,“性能损失”完全如您所料,因为您有四个线程在争夺两个CPU核心的实际计算资源。如果代码有大量内存交互,可以通过运行第二个线程来“隐藏”,则超线程将有所帮助。但如果您有CPU密集型代码,则并非如此“在缓存中丢失”越多,则增益就越小,在极端情况下,超线程实际上会导致速度减慢(因为一个线程中的代码会破坏缓存,否则会“妨碍”第一个线程)。您可能希望通过进入BIOS设置并关闭超线程来进行实验,然后比较结果。当然,运行两个代码实例显然需要更长的时间,但问题是“它是否比使用超线程运行的时间更长?”“-不幸的是,从理论上说哪一个更好是不可能的(即使我能看到汇编代码并理解内存访问模式-如果没有这种详细程度,就完全无法判断)。

在缩放后,你的图片几乎填满了我的整个22页屏幕上,我可以看出CPU标志显示“ht”,这意味着“超线程”,因此实际上只有两个真正的内核,在两个超线程之间共享。因此,同时在所有四个CPU内核上运行不会提供与在两个真正的内核上运行相同的性能

换句话说,“性能损失”完全如您所料,因为您有四个线程在争夺两个CPU核心的实际计算资源。如果代码有大量内存交互,可以通过运行第二个线程来“隐藏”,则超线程将有所帮助。但如果您有CPU密集型代码,则并非如此“在缓存中丢失”越多,则增益就越小,在极端情况下,超线程实际上会导致速度减慢(因为一个线程中的代码会破坏缓存,否则会“妨碍”第一个线程)。您可能希望通过进入BIOS设置并关闭超线程来进行实验