如何在其他核心上运行每个线程?

Posted

技术标签:

【中文标题】如何在其他核心上运行每个线程?【英文标题】:how to run each thread on other core? 【发布时间】:2012-10-04 12:58:18 【问题描述】:

我有一个接收数据并计算它的 udp 服务器。

每个角色都有两个线程。

在我的 cpu 中有一个 8 多核,我以各种速度发送数据。

但在最大情况下,我只使用了我的 cpu 两个核心 50% 的 %14%。如果我发送更多数据值,我的缓冲区将被填满并且不会使用更多 CPU。

为什么每个核心只出现 50% 而不是更多?

我想把这两个角色分给多核。

我想确保每个都在其他核心上。

如何显式选择在其他内核上运行的每个线程?

我的程序在 c++ visaul studio 9 上编写并在 windows7 上运行,我使用 boost::thread。

【问题讨论】:

不太清楚你在问什么。你有两个线程,你想介绍更多吗?还是您希望两个线程使用两个以上的内核?请澄清。 对不起,我希望线程使用两个以上的内核。 【参考方案1】:

注意编译器和链接器设置是否启用了多线程。

最佳做法也不是启动许多线程,而是启动长寿命线程,这些线程执行一些排队工作,例如计算或下载。

【讨论】:

【参考方案2】:

在每个线程中,您可以使用SetThreadAffinityMask 来选择您的线程应该在其上运行的 CPU。但我建议你为每个传入的请求创建一个新的工作线程(如果你使用线程池,你会看到相当大的性能提升)

【讨论】:

我需要这样使用吗?:SetThreadAffinityMask(GetThreadHandle(i), 1 你是天才,绝对是这样 当然,如果另一个程序也这样做,那么您将在 2-7 空闲时竞争 CPU 内核 0 和 1。让操作系统决定,它会尽可能让你的线程在同一个 CPU 内核上。【参考方案3】:

您不能让一个线程使用多个内核。为了获得更好的 CPU 利用率,您需要重新设计程序以创建更多线程并让操作系统为您安排它们。无需手动将线程限制为特定内核。操作系统非常擅长弄清楚如何将内核分配给线程。

在您的情况下,如果数据计算任务占用大量 CPU,您可以为每个请求生成一个新线程,或者拥有一个工作线程池来挑选传入任务并处理它们。这只是想法之一。如果不进一步了解您的应用程序架构及其试图解决的问题,就很难说。

【讨论】:

我认为这可能是这两个线程在一个核心上运行。我想确保每个线程都在另一个核心上。 操作系统会确保这一点。如果它们在一个核心上,那么必须有充分的理由。例如,其他进程需要更多 CPU。 您需要通过分析或试验找出瓶颈所在。然后,一旦你知道问题出在哪里,你就可以开始思考解决方案了。【参考方案4】:

调度程序将处理您的线程等将运行的位置。这是特定于操作系统的,因此如果您想尝试更改代码的运行方式,则需要一个特定于操作系统的 API,它可以让您设置线程关联等。

另外,取决于您的应用程序是什么样的,从外观上看它是一个客户端服务器,因此它并不完全受 CPU 限制。您总共有多少个线程,您提到每个角色 2 个?一个线程只能在一个 CPU 上运行。尝试制作可以真正并行运行的工作单元,这样它们就可以真正独立运行,最好是在不同的内核上运行。

操作系统通常会很好地运行您的代码,因为它的整体情况会更好。

【讨论】:

但是为什么只使用每个内核的 50% 呢? 也许没有足够的工作要做?或者线程之间存在同步而不是阻塞它们。 是的——“我的缓冲区将被填满,不再使用更多的 cpu”——听起来是网络绑定的,不是吗——没有任何东西可以使用更多的 CPU。 我的缓冲区已满,我的数据是错误的

以上是关于如何在其他核心上运行每个线程?的主要内容,如果未能解决你的问题,请参考以下文章

确保混合 MPI / OpenMP 在不同的内核上运行每个 OpenMP 线程

当我运行多个与 CPU 核心/线程数匹配的线程时,每个线程会在单独的核心/线程上运行吗?

如何查看正在运行线程的CPU核心?

如何设置 Java 线程的 cpu 核心亲和力?

代码如何在同步的单核CPU上异步?

每个核心的最佳线程数