假设我有一个C++进程,我希望这个进程并行运行八个线程。
假设:
我的问题是:
注意:当我说“并行”时,我指的是完全独立的逻辑线程。
发布于 2019-02-06 16:24:07
是的,一个有八个线程的进程可以同时在八个核心上运行。对操作系统来说,这些核心的物理安排(插座的数量)在很大程度上无关紧要。
我所知道的所有主要操作系统(Windows、Linux、*BSD)基本上都是如此。同样,我也不知道有任何C++编译器在这方面施加了限制。
要做到这一点,您必须做的主要事情是确保您的线程能够实际独立地执行。当存在相互依赖时,您可能会以一个线程(因此是一个内核)等待另一个线程结束。
根据您在线程中所做的事情的种类,创建一个或两个额外的线程(有时甚至更多,特别是如果可能有I/O绑定的线程)通常是有用的,因此总是有一个线程可以在任何给定的核心上运行,即使其中一个线程暂停等待输入(或者其他一些东西)。
但是,我应该补充一点,大多数当前的OSes在决定在哪里调度线程时确实会考虑套接字。通常在单个套接字中的核心之间共享一个缓存,但是每个套接字都有自己的单独缓存,所以在调度线程时可以考虑套接字来获得一些效率。这通常不会阻止线程在准备就绪的情况下运行,但是如果两个线程都准备好运行,则可能会显示出在特定套接字上调度每个线程的首选项。
同样,许多多套接字系统提供非统一的内存访问(NUMA).也就是说,每个CPU直接连接到内存的一部分。它可以使用存储在附加到不同CPU的内存中的数据,但这样做会增加延迟,并可能减少带宽。在这样的系统上,通常最好将线程调度到直接连接到内存上的套接字上,该套接字保存它们正在处理的数据。
为了帮助优化这一点,Windows和Linux都提供了NUMA功能,因此您可以控制线程调度和内存分配。这是一个可选的优化--您的程序可以使用所有没有它的套接字上的所有核心,但是如果您优化访问模式,可能会运行得更快。
还请注意,如果您使用这个错误,您可能会使您的程序悲观,因此它的运行速度将比默认情况下还要慢……
https://softwareengineering.stackexchange.com/questions/386761
复制相似问题