我在CentOS 7中使用单线程CPLEX和AMPL (我限制CPLEX显式地只使用一个线程)来建模和求解非线性程序(NLP)。我使用具有6个独立核心的处理器(英特尔i7 8700)来解决6个独立的测试实例。
当我按顺序运行这些测试时,考虑到时间流逝,它比并发运行这6个实例(大约63%)要快得多。它们在独立的进程中执行,读取不同的数据文件,并将结果写入不同的输出文件。我还尝试用多线程顺序地解决这些测试,我得到的时间与那些只有一个线程的情况类似。
我已经使用top/htop检查了这些进程的行为。它们使用不同的处理器来执行。所以我的问题是,如果这些测试只在一个线程的不同内核中求解,并且它们是单独的进程,那么这些测试的并发执行如何对所用时间产生如此大的影响?
任何想法都将不胜感激。
发布于 2018-11-15 01:04:58
这很容易使多个线程的性能比单个线程差。成功的多线程和加速的关键是不仅要了解程序是多线程的这一事实,而且要确切地知道线程是如何交互的。以下是您在查看代码时应该问自己的几个问题:
1)各个线程是否共享资源?如果是这样,那么这些资源是什么?当您访问它们时,它们是否会阻塞其他线程?
2)你的多线程代码依赖的最慢的资源是什么?一个常见的瓶颈(经常被忽视)是磁盘IO。多线程可以更快地处理数据,但它们不会使磁盘读取速度更快,而且在许多情况下,多线程会使情况变得更糟(例如,颠簸)。
3)对公共资源的访问是否同步?
为此,在不了解您的问题的情况下,我建议:
a)不从不同的线程读取不同的文件。您希望尽可能保持磁盘IO的顺序,这在单线程中更容易实现。也许可以从单个线程批量读取文件,然后将它们分包出来进行处理。
b)尽可能让你的线程保持自治--任何来回的通信都会导致线程争用并减慢速度。
https://stackoverflow.com/questions/53304285
复制相似问题