gpt4 book ai didi

c++ - 您能否将特定线程 ID 分组到 OpenMP 中的唯一任务组中?

转载 作者:行者123 更新时间:2023-11-30 05:15:55 25 4
gpt4 key购买 nike

在运行我的程序之前,我会这样做:

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 超线程。

我有一个线程正在使用的工作对象 vector 。他们根据自己的 ID 从 vector 中选择一个对象。

我正在尝试让 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() 函数中使用任何 taskgroupbarriercritical pragma 都会影响所有48 个线程,而不仅仅是应该共享对象的 2 个线程。

这是真的吗?我如何创建一组已知处理器绑定(bind)的线程(即将线程 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++ - 您能否将特定线程 ID 分组到 OpenMP 中的唯一任务组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42904007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com