您可以在 OpenMP 中将特定线程 ID 分组到唯一的任务组中吗?
Can you group specific thread id's into unique task groups in OpenMP?
在运行我的程序之前,我这样做:
export KMP_AFFINITY=explicit,proclist=[0-47],granularity=fine
然后我生成了 48 个线程:
#pragma omp parallel num_threads(48)
{
int id = omp_get_thread_num();
}
并行构造中的每个线程现在都有一个与处理器 ID 匹配的 ID。
现在。。。
处理器0 和处理器 24 实际上位于同一内核上。处理器 24 到 47 是 0 到 23 的超线程。
我有一个线程正在使用的工作对象向量。他们根据自己的 id 从向量中选择一个对象。
我正在尝试获取 0/24、1/25、2/26 等......超线程内核以配对特定的"worker"对象,然后在对象中使用任务组:
class Worker {
public:
int wId;
Worker(int i) {
wId = i;
}
void doWork() {
// Can I make a task group for the 2 threads reaching this code together?
// will barriers, taskgroups, critical pragmas wait for all 48 threads?
}
};
int main() {
vector<Worker> workers;
for (int i = 0; i < 48; ++i) {
Worker w(i);
workers.push_back(w);
}
#pragma omp parallel num_threads(48)
{
int id = omp_get_thread_num();
workers[id % 24].doWork();
}
}
我不确定这样的事情是否有效。我的假设是,在该doWork()
函数中使用taskgroup
或barrier
或critical
编译指示都会影响所有 48 个线程,而不仅仅是应该共享对象的 2 个线程。
这是真的吗?如何创建一组已知处理器绑定的线程(即将线程 0 和线程 23 放入一个组中)以执行我想要的操作?
对任何感兴趣的人...正如@Gilles指出的那样,解决方案是嵌套。诀窍是正确导出:
export OMP_NESTED=1
export OMP_MAX_ACTIVE_LEVELS=2
export KMP_HOT_TEAMS=1
export KMP_HOT_TEAMS_MAX_LEVEL=2
export OMP_PROC_BIND=spread,spread
export OMP_PLACES=cores
然后你可以这样做:
#pragma omp num_thread(24) {
#pragma omp num_thread(2) {
// paired hyperthread code
}
}
(来源:https://software.intel.com/en-us/articles/process-and-thread-affinity-for-intel-xeon-phi-processors-x200)
相关文章:
- 何时在引用或唯一指针上使用移动语义
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 计算排序向量的向量中唯一值的计数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 通过组合不同的类型来创建唯一的id
- 使用Unique_ptr确保工厂中的对象唯一
- 有没有任务栏API可以立即应用注册表更改
- c++多进程编写一个唯一的文件
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 如何更改唯一指针向量的可见性
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++尝试深度复制唯一指针时出现内存访问冲突
- 具有引用成员的结构是否具有唯一的对象表示形式
- 如何创建线程序列以按照启动顺序执行任务?
- 使用 RTTI 克隆唯一指针的向量
- 如何在 c++ 中迭代数组中的唯一元素
- C++一个线程如何正确通信其任务已完成?
- 您可以在 OpenMP 中将特定线程 ID 分组到唯一的任务组中吗?
- 使用OpenMP将循环划分为唯一的任务