如何使 MFC Visual Studio C++ 程序在双处理器设置中使用两个 CPU

How to make a MFC Visual Studio C++ program use both CPUs in a dual processor setup

本文关键字:CPU 两个 设置 Visual MFC 何使 Studio C++ 双处理器 程序      更新时间:2023-10-16

我最近构建了一个带有双至强E5-2699v4 CPU的工作站。这为我提供了总共 88 个线程。我有一个可以从使用这些线程中受益的程序。但是,当我对其进行测试时,似乎它在设置中仅使用了 1 个处理器。尝试使用超过 44 个线程将导致系统出现瞬时锁定。 该程序使用MFC Visual Studio C++。需要做什么来编写程序以使用两个处理器?

需要做什么来编写程序以使用两个处理器?

您需要了解代码如何花费 CPU 周期,即基准测试。继续阅读简单方法持续时间与上下文切换持续时间。


"C++没有核心的概念"。 因此,将线程与特定内核相关联的想法被委托给操作系统(程序正在执行),我还没有看到该问题C++语言语义。 我读过将线程与核心相关联的操作系统调用,但我从未摸索过原因,也没有进行过实验。

在 Ubuntu 上,我只需启动线程,并依靠操作系统 (Linux) 将每个正在运行的线程分配给可用的处理器资源。 Linux似乎做得还算不错。

我测量了两个线程来对两个独立的数据执行"相同"的比较工作,以将持续时间缩短一半,并且两个内核通常都被充分利用。 (小到没有 I/O 操作混在一起)


上下文切换比方法调用慢一个数量级。 因此,也许您的代码设计应该避免切换。

或者,也许是平衡,代码粒度的努力,即每个开关要完成多少代码。

在我的 Ubuntu 17.10 系统上,我测量了"::sem_wait()"和"::sem_post()"(两种小方法)的组合持续时间约为 31 ns(3,237,099 us 中的 103.7 M 事件),[当然没有上下文切换]。

在我的 2 核处理器上,我的一个测试运行 10 个线程 10 秒,并且不强制上下文切换,为线程到线程交互留下一个关键部分。 令我惊讶的是,在其中一个"饥饿"线程运行之前,同一个线程经常运行多次(在"Linux 次要基准测试" - lmbm 上这不是问题)。 代码报告每个上下文切换 297 ns。 (33 M 开关在 10 秒内,每个 297 ns)。

当我强制执行"平衡的核心共享"(通过每个线程使用两个信号量)时,每个线程的运行频率与其他线程一样频繁。 切换持续时间相当长(但目前我无法使用)。


我没有机会在 10 个内核上测量 44 个线程,这听起来很有趣。 我估计性能范围会"大"——也许从"停滞"到 10 个线程的持续时间的"10 倍"。不取决于代码在哪个内核上运行,而是取决于代码运行时的作用。