Linux中线程和进程的性能表现

3

我在同一台机器上使用Linux处理两种不同的情况。这台机器有两个Xeon处理器,每个处理器都有8个内核和16个线程。

  1. 我有一个用OpenMP并行化的C++代码。在这种情况下,如果我使用所有线程(根据Linux内核计算为32个),是否会出现线程之间存在互相竞争的惩罚?也就是说,设置32个线程是此情景下的最佳配置吗?

  2. 我运行一定数量的进程(全部都是单线程),使用相同的二进制文件。基本上,我有一个脚本,利用不同的输入文件生成相同的二进制文件。在这种情况下,启动这些进程的最佳方法是什么,以避免过度消耗机器的性能?我认为,如果同时运行32个进程,会损害机器的性能。


1
大多数情况下,您只需让OpenMP自行决定使用多少线程即可。运行32个进程可能会影响性能,这通常取决于它们的I/O密集程度。提到输入文件暗示它们可能是I/O限制型的,如果是这样,那么同时运行几个进程很少会带来好处(但这将严重依赖于存储的可用带宽)。 - Jerry Coffin
1个回答

3
  1. 对于CPU密集型任务(超线程核心共享资源),最优的线程数通常在16到32之间;对于内存密集型或者I/O密集型任务,线程数可以更少。

    但是,在大多数情况下,使用和CPU核心数量相同的线程数作为起点是一个不错的选择。

  2. 为什么会有害呢?在Linux中,线程只是共享虚拟地址空间(以及大多数其他操作系统资源)的进程。如果您有足够的RAM来使它们在没有页面交换的情况下运行,并且每个进程都是单线程的,则32就像线程情况下一样好。


  1. 请注意,对于等效的多线程程序,情况基本相同,因为程序代码在应用程序的各个实例之间共享。

该进程仅使用输入一次。代码读取输入并开始某些密集计算(量子化学代码)。一些方法可能会在阵发性中经常使用大量IO。内存的使用非常简单:代码通过new在开始时分配内存并使用它直到计算结束。机器上可用的物理RAM足以同时计算32个进程。 - rbw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接