如何使 MFC Visual Studio C++ 程序在双处理器设置中使用两个 CPU
How to make a MFC Visual Studio C++ program use both CPUs in a dual processor setup
我最近构建了一个带有双至强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 倍"。不取决于代码在哪个内核上运行,而是取决于代码运行时的作用。
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 维护/维持两个代码集的风险,一个用于 CPU,一个用于 GPU,需要执行非常相似的功能
- 如何使 MFC Visual Studio C++ 程序在双处理器设置中使用两个 CPU
- Boost asio和线程,如果我运行两个实例,我得到cpu在100%
- 在Windows下查找两个时间戳之间的CPU活动
- 响应性地检查两个队列而不锁定CPU