首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个进程使用std::线程,2个物理CPU,每个内核4个,并行级别?

一个进程使用std::线程,2个物理CPU,每个内核4个,并行级别?
EN

Software Engineering用户
提问于 2019-02-06 16:12:50
回答 1查看 2.1K关注 0票数 2

假设我有一个C++进程,我希望这个进程并行运行八个线程。

假设:

  • 我有一台有两个物理CPU的电脑。
  • 每个CPU有四个(4)核,所以4x2 = (8)核总数。
  • 每个核心只允许一个逻辑线程,因此(8)逻辑线程总数。
  • 我正在使用x8664位操作系统.

我的问题是:

  • 我可以使用一个进程在上面的系统上并行运行八个线程吗?
  • 这取决于我所使用的x64操作系统吗?如果是这样的话,Ubuntu x64和x64 10的区别是什么?
  • 这取决于我使用的编译器吗?如果是这样的话,GCC、VC++、clang和Intel在这方面比较如何?

注意:当我说“并行”时,我指的是完全独立的逻辑线程。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2019-02-06 16:24:07

是的,一个有八个线程的进程可以同时在八个核心上运行。对操作系统来说,这些核心的物理安排(插座的数量)在很大程度上无关紧要。

我所知道的所有主要操作系统(Windows、Linux、*BSD)基本上都是如此。同样,我也不知道有任何C++编译器在这方面施加了限制。

要做到这一点,您必须做的主要事情是确保您的线程能够实际独立地执行。当存在相互依赖时,您可能会以一个线程(因此是一个内核)等待另一个线程结束。

根据您在线程中所做的事情的种类,创建一个或两个额外的线程(有时甚至更多,特别是如果可能有I/O绑定的线程)通常是有用的,因此总是有一个线程可以在任何给定的核心上运行,即使其中一个线程暂停等待输入(或者其他一些东西)。

但是,我应该补充一点,大多数当前的OSes在决定在哪里调度线程时确实会考虑套接字。通常在单个套接字中的核心之间共享一个缓存,但是每个套接字都有自己的单独缓存,所以在调度线程时可以考虑套接字来获得一些效率。这通常不会阻止线程在准备就绪的情况下运行,但是如果两个线程都准备好运行,则可能会显示出在特定套接字上调度每个线程的首选项。

同样,许多多套接字系统提供非统一的内存访问(NUMA).也就是说,每个CPU直接连接到内存的一部分。它可以使用存储在附加到不同CPU的内存中的数据,但这样做会增加延迟,并可能减少带宽。在这样的系统上,通常最好将线程调度到直接连接到内存上的套接字上,该套接字保存它们正在处理的数据。

为了帮助优化这一点,Windows和Linux都提供了NUMA功能,因此您可以控制线程调度和内存分配。这是一个可选的优化--您的程序可以使用所有没有它的套接字上的所有核心,但是如果您优化访问模式,可能会运行得更快。

还请注意,如果您使用这个错误,您可能会使您的程序悲观,因此它的运行速度将比默认情况下还要慢……

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/386761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档