我正在尝试设置核心亲和力(线程#1进入第一个核心,线程#2进入第二个核心,......),同时在C++ 11中使用std :: thread.
我已经在各种主题和互联网上搜索过,似乎C++ 11 API没有提供如此低级别的功能.
另一方面,pthreads带有pthread_setaffinity_np,如果我可以得到我的std :: thread的"pthread_t"值(我不知道这是人类合理还是至少是合法的要求),这将非常有用.
我最终想要的一个示例程序是:
#include <thread>
#include <pthread.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define CORE_NO 8
using namespace std;
void run(int id) {
cout << "Hi! I'm thread " << id << endl;
// thread function goes here
}
int main() {
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
for(int i=0; i<CORE_NO; i++)
CPU_SET(i, &cpu_set);
thread t1(run, 1);
// obtaining pthread_t from t1
/*
pthread_t this_tid = foo(t1);
pthread_setaffinity_np(this_tid, sizeof(cpu_set_t), &cpu_set);
*/
t1.join();
return …Run Code Online (Sandbox Code Playgroud) 我正在用c ++开发一个应用程序.该应用程序的一个组件使用Matlab(通过Matlab引擎)进行数据处理.同时,数据采集系统将数据流传输到磁盘.偶尔,在强化Matlab处理期间,采集系统崩溃.通过将Matlab的处理器亲和性设置为可用处理器的子集,可以解决此问题.但是,由于应用程序每天启动几次,并且在多台计算机上,每次手动设置关联是不方便的.通过快捷方式的命令行设置处理器关联性的技巧不起作用,因为引擎是从我的应用程序内启动的,而不是通过快捷方式启动的.我一直在寻找一种以编程方式设置亲和力的方法,但成效有限.
我考虑了以下选项(按优先顺序排列):
是否可以在我的应用程序中设置处理器关联,如果是,如何设置?如果没有,解决这个问题的正确方法是什么?对这些选项或其他建议/解决方案的任何建议都将受到欢迎.
我注意到如果我在BIOS中禁用超线程,我的多线程计算会运行得更快.
我还了解到,我可以通过修改当前进程的处理器关联来以编程方式禁用(逻辑)CPU:例如,在C#中这样:
// using System.Diagnostics;
var current = Process.GetCurrentProcess();
var affinity = current.ProcessorAffinity.ToInt32();
current.ProcessorAffinity = new IntPtr(affinity & 0x5555);
Run Code Online (Sandbox Code Playgroud)
至少从性能的角度来看,通过改变处理器亲和性来禁用每秒(逻辑)CPU与完全禁用超线程具有相同的效果吗?
如何在内核模块中设置进程的CPU亲和性?在用户模式下有一个系统调用sched_setaffinity,但我正在寻找等效的内核模式.
在Linux内核代码中,还有一个名为的函数sched_setaffinity.它是从sys_sched_setaffinity被调用的函数调用的system_call.从它看来,这是我想要使用的功能.它与系统调用同名的事实让我有点不安.
但众所周知,最好的办法就是尝试一下.所以我做了,我的模块编译完毕.但是,当我尝试加载模块时,它会抱怨名称sched_setaffinity未定义.
我想知道是否有可能识别具体的线程使用的物理处理器(核心)thread-id?
例如,我有一个具有两(2)的螺纹(多线程应用程序thread-id = 10和thread-id = 20,例如).我在具有双核处理器(核心1和核心2)的系统上运行该应用程序.那么,我如何获得线程使用的核心号码thread-id = 20呢?
PS Windows平台.
谢谢,
丹尼斯.
我有一个服务器进程,它会分叉许多子进程.服务器进程与CPU核心具有亲缘关系,但我不希望子进程继承该亲和性(而OS应该处理运行这些进程的位置).有没有办法将父子进程与cpu亲和关系脱钩?
在我主要工作的linux中,我们使用一种称为CPU隔离的技术,它可以有效地将进程锁定到处理器上,还可以防止处理器运行其他任何东西.我们的内核人员做了一些魔术来处理中断.
在Windows中,我发现最接近的是一个亲和概念,它似乎将进程/线程绑定到处理器.但它不能保证处理器仅运行该进程/线程意味着仍然可以存在上下文切换和其他抖动.
有没有办法在Windows上隔离CPU以确定半确定的运行时间?
我想设置 Intel 10G NIC 使用的 RX/TX 队列数。让我解释一下原因:
我在 Dell R720 系统上使用 X520 型 Intel 10G NIC。我正在使用 ixgbe 版本 3.6.7-k。Ubuntu 3.2.0-59 中的内核。
我正在机器上 24 个内核中的 4 个内核上运行我的网络应用程序。目前 NIC 正在使用流导向器,所以我有 24 个 TX 和 RX 队列,而大多数 IRQ 最终在运行应用程序的 4 个内核上运行。
但是,我看到一些 IRQ 正在其他 20 个队列上运行(这可能是因为流导向器对大约 20% 的流量进行采样,因此一些流量通过常规 RSS)。现在我不希望在其他 20 个内核上运行任何 IRQ,因为它们正在执行不同的任务,而这些任务会被运行的 IRQ 损坏。
我尝试仅将中断的关联设置为我使用的 4 个内核,但这不适用于 flow-director。我想更好的方法是仅使用 4 个 RX/TX 队列并将它们分配给专用内核。但是我找不到在 ixgbe 驱动程序中设置 RX/TX 队列数量的方法(尽管这对于我熟悉的其他 10G 驱动程序非常简单,例如 Broadcom 的 bnx2x)。
任何的想法?
我想将代码中的线程绑定到每个物理核心.使用GCC我已成功完成此操作,sched_setaffinity因此我不再需要设置export OMP_PROC_BIND=true.我想在Windows中使用MSVC做同样的事情.Windows和Linux使用不同的线程拓扑.当Windows使用紧凑形式时,Linux会分散线程.换句话说,在具有四个内核和八个超线程的Linux中,我只需要将线程绑定到前四个处理单元.在Windows中,我将它们设置为每个其他处理单元.
我已成功完成此操作SetProcessAffinityMask.当我右键单击进程并单击"Set Affinity"时,我可以从Windows Task Manger中看到每个其他CPU都已设置(我的8个超线程系统上的0,2,4,6).问题是我运行时代码的效率不稳定.有时它几乎不变,但大部分时间都有很大的变化.我把优先级改为高,但没有区别.在Linux中,效率是稳定的.也许Windows还在迁移线程?在Windows中绑定线程还需要做些什么吗?
这是我正在使用的代码
#ifdef _WIN32
HANDLE process;
DWORD_PTR processAffinityMask = 0;
//Windows uses a compact thread topology. Set mask to every other thread
for(int i=0; i<ncores; i++) processAffinityMask |= 1<<(2*i);
//processAffinityMask = 0x55;
process = GetCurrentProcess();
SetProcessAffinityMask(process, processAffinityMask);
#else
cpu_set_t mask;
CPU_ZERO(&mask);
for(int i=0; i<ncores; i++) CPU_SET(i, &mask);
sched_setaffinity(0, sizeof(mask), &mask);
#endif
Run Code Online (Sandbox Code Playgroud)
编辑:这是我现在使用的代码,它似乎在Linux和Windows上稳定
#ifdef _WIN32
HANDLE process;
DWORD_PTR processAffinityMask;
//Windows uses a compact thread topology. Set mask to every other …Run Code Online (Sandbox Code Playgroud) 我正在调查如何在专用CPU上运行进程以避免上下文切换.在我的Ubuntu上,我使用内核参数"isolcpus = 3,7"和"irqaffinity = 0-2,4-6"隔离了两个CPU.我确信它已被正确考虑到:
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.8.0-27-generic root=UUID=58c66f12-0588-442b-9bb8-1d2dd833efe2 ro quiet splash isolcpus=3,7 irqaffinity=0-2,4-6 vt.handoff=7
Run Code Online (Sandbox Code Playgroud)
重启后,我可以检查一切是否按预期工作.在我运行的第一个控制台上
$ stress -c 24
stress: info: [31717] dispatching hogs: 24 cpu, 0 io, 0 vm, 0 hdd
Run Code Online (Sandbox Code Playgroud)
在第二个,使用"顶部"我可以检查我的CPU的使用情况:
top - 18:39:07 up 2 days, 20:48, 18 users, load average: 23,15, 10,46, 4,53
Tasks: 457 total, 26 running, 431 sleeping, 0 stopped, 0 zombie
%Cpu0 :100,0 us, 0,0 sy, 0,0 ni, 0,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu1 : 98,7 …Run Code Online (Sandbox Code Playgroud)