并发进程比单进程慢很多

时间:2018-11-14 16:02:40

标签: multithreading concurrency parallel-processing cplex ampl

我正在CentOS 7中使用具有AMPL的单线程CPLEX建模和求解非线性程序(NLP)(我正在约束CPLEX明确仅使用一个线程)。我正在使用具有6个独立核(intel i7 8700)的处理器)解决6个独立的测试实例。

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

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

任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

a)不从不同的线程读取不同的文件。您想要使磁盘IO尽可能保持顺序,并且从单个线程更容易做到这一点。也许可以从单个线程中批量读取文件,然后然后将它们放出来进行处理。

b)保持线程尽可能自治-来回进行任何通信都会引起线程争用并使速度变慢。