C++ linux中线程和进程的性能

C++ linux中线程和进程的性能,c++,linux,C++,Linux,我在Linux中有两个场景,我已经在同一台机器上工作了一段时间。该机器有两个xeon处理器,每个处理器有8个内核和16个线程 >P>我有一个C++代码,与OpenMP并行化。在这个场景中,如果我使用所有线程(根据Linux内核,总共32个线程),那么在线程之间的并发性方面会有任何惩罚吗?我的意思是,设置32个线程是这个场景的最佳配置 我使用相同的二进制文件运行给定数量的进程(都是单线程的)。基本上我有一个脚本,用不同的输入文件生成相同的二进制文件。在这种情况下,启动这些过程而不耗尽机器的最佳方

我在Linux中有两个场景,我已经在同一台机器上工作了一段时间。该机器有两个xeon处理器,每个处理器有8个内核和16个线程

>P>我有一个C++代码,与OpenMP并行化。在这个场景中,如果我使用所有线程(根据Linux内核,总共32个线程),那么在线程之间的并发性方面会有任何惩罚吗?我的意思是,设置32个线程是这个场景的最佳配置

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

  • 对于CPU受限的任务(),最佳值通常在16到32之间;对于内存限制甚至IO限制的任务,它可以更低

    不过,在大多数情况下,使用尽可能多的线程作为核心是一个很好的起点

  • 为什么它是有害的?在Linux中,线程只是碰巧共享虚拟地址空间(和大多数其他操作系统资源)的进程。如果您有足够的RAM使它们在不分页的情况下运行,并且每个进程都是单线程,那么根据线程的情况,32也可以


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

  • 大多数情况下,您只想让OpenMP自己决定要使用多少线程。运行32个进程可能会或可能不会影响性能—通常取决于它们的I/O密集程度。提到输入文件暗示它们可能是I/O绑定的,在这种情况下,您很少会从并发运行的多个进程中获益(但这在很大程度上取决于存储的可用带宽)。这些进程只使用一次输入。代码读取输入并开始一些密集的计算(量子化学代码)。有些方法可能会使用大量IO—不是一直使用,而是在突发情况下使用。内存的使用很简单:代码从一开始就用new分配内存,直到计算结束。机器中可用的物理ram足以同时计算32个进程。