Windows Openmp 设置线程亲缘性
来源:互联网 发布:怎么增强手机网络信号 编辑:程序博客网 时间:2024/05/16 14:42
Openmp中如何设置线程的亲缘性,在Linux系统上非常简单,只需要export一些环境变量就可以了,但在Windows上的设置就没这么容易能找到解决办法了。
首先要明确一点的是,线程一般情况下不会固定在某个物理核或者逻辑核上一直运行下去,很可能前一秒在逻辑核1跑完就会迁移到逻辑核3,这是很有可能的。
如果想知道线程是在机器的哪个逻辑核上跑动,Linux上会用到sched_getcpu()这个函数,而Windows上会用到GetCurrentProcessorNumber()这个函数。
我一度认为VC++编译器中支持的Openmp2.0不能满足线程绑定逻辑核的需求,因此我迁移去了intel的编译器(支持Openmp4.0),从而去用proc_bind(spread)的调度策略,然而发现并不如我所愿,线程依然会在各个逻辑核上迁移。
经过一段时间的试验后,我发现原来是用SetThreadAffinityMask(HANDLE, DWORD_PTR)这个函数,示例如下:
#pragma omp for
for (int i = 0; i < m_iNumberY; i++)
{
int tid = omp_get_thread_num();
switch (tid)
{
case 0:
SetThreadAffinityMask(GetCurrentThread(), 0x00000001); // 第一个逻辑核(CPU core),序号0
break;
case 1:
SetThreadAffinityMask(GetCurrentThread(), 0x00000002);//第二个逻辑核(CPU core),序号1
break;
case 2:
SetThreadAffinityMask(GetCurrentThread(), 0x00000004); // 第三个逻辑核(CPU core),序号2
break;
case 3:
SetThreadAffinityMask(GetCurrentThread(), 0x00000008); 第四个逻辑核(CPU core),序号3
break;
default:
break;
}
for (int j = 0; j < m_iNumberX; j++)
{
int cpu_num = GetCurrentProcessorNumber();
printf("tid %d is running on logical cpu num %d\n",tid, cpu_num);
}
}
结果如下:
希望能帮到同样需要为Openmp的线程设置亲缘性的其他人,在Windows上找到设置办法确实不容易找出来。
- Windows Openmp 设置线程亲缘性
- 设置线程的亲缘性,多线程编程
- windows核心编程-线程的亲缘性
- windows线程调度、线程优先级和亲缘性
- Linux线程亲缘性
- 设置程序亲缘性
- Windows Programming系列 线程的调度、优先级和亲缘性
- Windows高级编程之线程调度、优先级和亲缘性
- Windows内核之线程的调度,优先级,亲缘性
- Windows C/C++ 学习线程调度、线程优先级和亲缘性
- Windows核心编程<读书笔记七>线程的调度、优先级以及亲缘性 【含有代码】
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)
- 线程的调度,优先级和亲缘性
- 线程的调度、优先级和亲缘性
- 进程与线程的亲缘性
- C7、线程的调度、优先级、亲缘性
- C++/MFC-进程/线程亲缘性
- 七大设计原则
- 机器学习练习记录(3):HMM中,如果已知观察序列和产生观察序列的状态序列,如何直接进行参数估计?
- 《Java与模式》之观察者模式
- leetcode 110. Balanced Binary Tree
- Unity的Scene视图中Irradiance模式的作用
- Windows Openmp 设置线程亲缘性
- JAX-WS HandlerChain使用详解
- 2668: [cqoi2012]交换棋子
- 欧里几德及扩展欧里几德算法
- Ubuntu14.04安装cuda7.5出现login loop error解决办法
- Socket编程一实现简易的聊天功能以及文件传输
- (转)招商银行这一招,引起了各大银行的注意
- [CODEVS1907]方格取数3(最小割)
- hive启动之异常