同时运行一个进程多次

Posted

技术标签:

【中文标题】同时运行一个进程多次【英文标题】:Running a process multiple times at the same time 【发布时间】:2014-02-20 08:20:37 【问题描述】:

我有一个带有 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的结果:

版本5是进程,运行一次 两个版本5同时运行

CPU 信息:

提前致谢。

【问题讨论】:

没有真正看到你的代码,很难确切地说出代码在做什么......但似乎有点可疑。 了解您的 CPU 是什么也很有帮助。例如,英特尔超线程处理器的行为与具有“四个真实内核”的处理器不同。 我已经添加了我的 CPU 详细信息。 当Version5运行一次循环运行时表现如何 我想你还没有听说过复制/粘贴文本? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:
    当仅运行一个进程达到 60% 的 CPU 使用率时,使用多线程可能会加快执行速度。但是,CPU 使用率可能会更高 确实如此。上下文切换(多任务)可能会有额外的开销 更改函数可以带来一些改进,但如果没有您的代码就很难说。 由于计算量如此之大,我认为您必须决定是接受高 CPU 使用率还是接受更长的执行时间(当然是在优化代码本身之后)

问候

【讨论】:

以上是关于同时运行一个进程多次的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 UNIX shell 脚本并行运行一个进程多次?

进程切换 多线程并发

java多线程总结

如何在一个进程中多次启动 pyqt GUI?

多次调用std :: cout会使子进程挂起

python学习笔记(多进程并发)