标签: affinity

通过pthreads获取C++ 11中的线程核心关联

我正在尝试设置核心亲和力(线程#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++ multicore pthreads affinity c++11

8
推荐指数
2
解决办法
7764
查看次数

为MATLAB引擎设置处理器关联(Windows 7)

我正在用c ++开发一个应用程序.该应用程序的一个组件使用Matlab(通过Matlab引擎)进行数据处理.同时,数据采集系统将数据流传输到磁盘.偶尔,在强化Matlab处理期间,采集系统崩溃.通过将Matlab的处理器亲和性设置为可用处理器的子集,可以解决此问题.但是,由于应用程序每天启动几次,并且在多台计算机上,每次手动设置关联是不方便的.通过快捷方式的命令行设置处理器关联性的技巧不起作用,因为引擎是从我的应用程序内启动的,而不是通过快捷方式启动的.我一直在寻找一种以编程方式设置亲和力的方法,但成效有限.

我考虑了以下选项(按优先顺序排列):

  1. 在引擎启动时,从应用程序内指定matlab引擎的处理器关联.
  2. 为matlab引擎指定默认的处理器关联,与完整的Matlab应用程序本身分开.
  3. 作为最后的手段,为Matlab设置默认关联(引擎和非引擎使用).这是最不可取的,因为Matlab在部署机器上用于其他目的,并且最好不要将其限制用于其他用途.

是否可以在我的应用程序中设置处理器关联,如果是,如何设置?如果没有,解决这个问题的正确方法是什么?对这些选项或其他建议/解决方案的任何建议都将受到欢迎.

c++ matlab matlab-engine affinity windows-7

7
推荐指数
1
解决办法
1157
查看次数

禁用超线程与更改ProcessorAffinity?

我注意到如果我在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与完全禁用超线程具有相同的效果吗?

c# performance affinity hyperthreading

7
推荐指数
1
解决办法
2001
查看次数

如何从Linux内核模式设置进程的亲和性?

如何在内核模块中设置进程的CPU亲和性?在用户模式下有一个系统调用sched_setaffinity,但我正在寻找等效的内核模式.

在Linux内核代码中,还有一个名为的函数sched_setaffinity.它是从sys_sched_setaffinity被调用的函数调用的system_call.从它看来,这是我想要使用的功能.它与系统调用同名的事实让我有点不安.

但众所周知,最好的办法就是尝试一下.所以我做了,我的模块编译完毕.但是,当我尝试加载模块时,它会抱怨名称sched_setaffinity未定义.

linux kernel kernel-module affinity linux-kernel

6
推荐指数
1
解决办法
2726
查看次数

识别处理器(核心)由特定线程使用

我想知道是否有可能识别具体的线程使用的物理处理器(核心)thread-id

例如,我有一个具有两(2)的螺纹(多线程应用程序thread-id = 10thread-id = 20,例如).我在具有双核处理器(核心1和核心2)的系统上运行该应用程序.那么,我如何获得线程使用的核心号码thread-id = 20呢?

PS Windows平台.

谢谢,

丹尼斯.

windows multithreading processor affinity

6
推荐指数
1
解决办法
7194
查看次数

如何防止子分叉进程继承CPU亲和力?

我有一个服务器进程,它会分叉许多子进程.服务器进程与CPU核心具有亲缘关系,但我不希望子进程继承该亲和性(而OS应该处理运行这些进程的位置).有没有办法将父子进程与cpu亲和关系脱钩?

c++ linux fork affinity execvp

6
推荐指数
1
解决办法
2270
查看次数

在Windows上固定处理器CPU隔离

在我主要工作的linux中,我们使用一种称为CPU隔离的技术,它可以有效地将进程锁定到处理器上,还可以防止处理器运行其他任何东西.我们的内核人员做了一些魔术来处理中断.

在Windows中,我发现最接近的是一个亲和概念,它似乎将进程/线程绑定到处理器.但它不能保证处理器仅运行该进程/线程意味着仍然可以存在上下文切换和其他抖动.

有没有办法在Windows上隔离CPU以确定半确定的运行时间?

windows multithreading smp affinity isolation

6
推荐指数
1
解决办法
1903
查看次数

ixgbe:设置RX/TX队列数

我想设置 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)。

任何的想法?

networking nic affinity irq linux-device-driver

6
推荐指数
1
解决办法
2万
查看次数

与Windows,MSVC和OpenMP的线程关联

我想将代码中的线程绑定到每个物理核心.使用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)

multithreading openmp affinity visual-c++

6
推荐指数
1
解决办法
4088
查看次数

无法避免在CPU上单独启动的进程上的上下文切换

我正在调查如何在专用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)

performance scheduler affinity context-switch linux-kernel

6
推荐指数
2
解决办法
1083
查看次数