gpt4 book ai didi

OpenMP 线程 "disobey"omp 屏障

转载 作者:行者123 更新时间:2023-12-02 06:32:52 27 4
gpt4 key购买 nike

所以这是代码:

#pragma omp parallel private (myId)
{
set_affinity();

myId = omp_get_thread_num();

if (myId<myConstant)
{
#pragma omp for schedule(static,1)
for(count = 0; count < AnotherConstant; count++)
{
//Do stuff, everything runs as it should
}
}

#pragma omp barrier //all threads wait as they should
#pragma omp single
{
//everything in here is executed by one thread as it should be
}
#pragma omp barrier //this is the barrier in which threads run ahead
par_time(cc_time_tot, phi_time_tot, psi_time_tot);
#pragma omp barrier
}
//do more stuff

现在解释一下发生了什么。在并行区域开始时,myId 设置为私有(private),以便每个线程都有其正确的线程 ID。 set_affinity() 控制哪个线程在哪个核心上运行。我遇到的问题涉及 #pragma omp for Schedule(static,1)。

block :

  if (myId<myConstant)
{
#pragma omp for schedule(static,1)
for(count = 0; count < AnotherConstant; count++)
{
//Do stuff, everything runs as it should
}
}

代表我想要在一定数量的线程(0 到 myConstant-1)上分发的一些工作。在这些线程上,我想均匀地(以 Schedule(static,1) 的方式)分配循环的迭代。这一切都执行正确。

然后代码进入一个区域,其中的所有命令都按其应有的方式执行。但是假设我将 myConstant 指定为 2。那么,如果我使用 3 个或更多线程运行,则单个 Material 中的所有内容都会正确执行,但 id 为 3 或更大的线程不会等待单个 Material 中的所有命令完成。

在单个线程中调用一些函数来创建由所有线程执行的任务。 id 为 3 或更大(通常为 myConstant 或更大)的线程继续执行 par_time(),而其他线程仍在执行由 single 中执行的函数创建的任务。 par_time() 只是为每个线程打印一些数据。

如果我注释掉 pragma omp for Schedule(static,1) 并且只有一个线程执行 for 循环(例如将 if 语句更改为 if(myId==0)),那么一切正常。所以我只是不确定为什么上述线程会继续下去。

如果有任何令人困惑的地方,请告诉我,这是一个特定的问题。我一直在寻找,看看是否有人发现我的 OMP 流量控制存在缺陷。

最佳答案

如果您查看 OpenMP V3.0 规范,第 2.5 节“工作共享构造”会指出:

The following restrictions apply to worksharing constructs:

  • Each worksharing region must be encountered by all threads in a team or by none at all.
  • The sequence of worksharing regions and barrier regions encountered must be the same for every thread in a team.

通过在 if 内进行工作共享,您违反了这两个限制,从而使您的程序不合格。根据规范,不合格的 OpenMP 程序具有“未指定”行为。

至于哪些线程将用于执行 for 循环,当调度类型为“static,1”时,第一个工作 block (在本例中 count=0)将分配给线程 0。下一个工作 block (count=1)将被分配给线程1,依此类推,直到分配完所有 block 。如果 block 数多于线程数,则分配将以循环方式在线程 0 处重新启动。您可以阅读 OpenMP 规范第 2.5.1 节“循环构造”中有关 Schedule 子句的说明中的确切措辞。

关于OpenMP 线程 "disobey"omp 屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4771501/

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