Multithreading 并发进程比单个进程慢得多

Multithreading 并发进程比单个进程慢得多,multithreading,concurrency,parallel-processing,cplex,ampl,Multithreading,Concurrency,Parallel Processing,Cplex,Ampl,我正在CentOS 7中使用带AMPL的单线程CPLEX(我限制CPLEX仅显式使用一个线程)对非线性程序(NLP)进行建模和求解。我使用一个具有6个独立内核的处理器(intel i7 8700)来解决6个独立测试实例 当我按顺序运行这些测试时,考虑到时间的流逝,它比并发运行这6个实例(大约63%)要快得多。它们在独立的进程中执行,读取不同的数据文件,并将结果写入不同的输出文件。我还尝试用多线程顺序解决这些测试,我得到的时间与那些只有一个线程顺序的情况相似 我已使用top/htop检查了这些过程

我正在CentOS 7中使用带AMPL的单线程CPLEX(我限制CPLEX仅显式使用一个线程)对非线性程序(NLP)进行建模和求解。我使用一个具有6个独立内核的处理器(intel i7 8700)来解决6个独立测试实例

当我按顺序运行这些测试时,考虑到时间的流逝,它比并发运行这6个实例(大约63%)要快得多。它们在独立的进程中执行,读取不同的数据文件,并将结果写入不同的输出文件。我还尝试用多线程顺序解决这些测试,我得到的时间与那些只有一个线程顺序的情况相似

我已使用top/htop检查了这些过程的行为。它们有不同的处理器来执行。所以我的问题是,如果这些测试是在只有一个线程的不同内核中解决的,并且它们是单独的进程,那么并发执行这些测试将如何对所用的时间产生如此大的影响

如有任何想法,将不胜感激

很容易使多个线程的性能比单个线程差。成功的多线程和加速的关键是不仅要了解程序是多线程的这一事实,还要确切地知道线程是如何交互的。在查看代码时,您应该问自己以下几个问题:

1) 各个线程是否共享资源?如果是,那么这些资源是什么?当您访问它们时,它们是否会阻止其他线程

2) 多线程代码所依赖的最慢资源是什么?一个常见的瓶颈(经常被忽略)是磁盘IO。多线程可以更快地处理数据,但它们不会加快磁盘读取速度,在许多情况下,多线程会使读取速度变得更差(例如抖动)

3) 对公共资源的访问是否正确同步

为此,在不了解您的问题的情况下,我建议:

a) 不从不同的线程读取不同的文件。您希望尽可能保持磁盘IO的连续性,而单线程更容易做到这一点。可能是从单个线程批量读取文件,然后将其转出进行处理


b) 尽可能保持线程的自治性—任何来回的通信都会导致线程争用并降低速度。

我同意Andy的观点,即某些地方存在资源不足,但我认为这是内存问题,而不是磁盘IO问题。AMPL和CPLEX都不做很多IO,但CPLEX在通过AMPL解决NLP时解决的LPs/MIPs的大小可能会变得相当大。您是否可以使用top/htop检查您拥有多少内存以及各个解算进程消耗了多少内存?同意-可能是和/或RAM,具体取决于文件大小。一种可能的判断方法是连续运行几次-如果第一次运行明显比第二次慢,那么可能是第二次运行时页面缓存加快了磁盘IO。如果没有,很可能在别处。谢谢大家的评论。他们很有帮助。我检查了内存,每个进程使用大约3%的内存。我有62.5G的RAM内存。我读取了数据,之后只对这些模型进行处理。我已经测试了taskset,看看它是否能在ALU和FPU共享方面给我带来一些改进,但即使定义不同的内核,时间仍然很慢。也许它不见了?