- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以这是代码:
#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/
好的,我希望以前没有问过这个问题,因为在搜索中很难找到。 我查看了 F95 手册,但仍然觉得这很模糊: For the simple case of: DO i=0,99 END DO 我正
这两者有什么区别? [一] #pragma omp parallel { #pragma omp for for(int i = 1; i < 100; ++i) {
这两者有什么区别? [一] #pragma omp parallel { #pragma omp for for(int i = 1; i < 100; ++i) {
我有这段代码: #include #include int main(){ int i,j = 0 ; int tid; # pragma omp parallel pri
刚开始接触OPENMP,想用它来求解波动方程,串口代码在这里: #include #include #include #include #define GRID_SZ 3000 #define
我对 omp single 感到困惑和 omp task指令。我已经阅读了几个使用它们的例子。以下示例显示如何使用任务构造来处理链表的元素。 1 #pragma omp parallel 2 {
我试图了解 omp ordered 和 omp critical 之间的区别。他们都没有相同的语义吗?每个线程中编写的代码都被串行执行,当一个线程处于有序/关键 block 中时,其他线程等待。我看不
是否可以在 omp 并行 block 之外使用 omp pragma,如 critical、single、master 或 barrier?我有一个函数可以从 OMP 并行 block 调用,也可以不
我想测试 #pragma omp parallel for 和 #pragma omp simd 一个简单的矩阵加法程序。当我分别使用它们时,我没有收到任何错误,而且看起来还不错。但是,我想测试使用它
考虑: void saxpy_worksharing(float* x, float* y, float a, int N) { #pragma omp parallel for
我试图了解 #pragma omp critical 之间的确切区别和 #pragma omp single在 OpenMP 中: Microsoft 对这些的定义是: Single:让您指定应在其上
在带有 openMP 的 C++ 中,两者之间有什么区别吗 #pragma omp parallel for for(int i=0; i
我正在处理一些事情,试图让孤立工作发挥作用,并通过减少 #pragma omp parallel 的调用来减少开销。我正在尝试的是这样的: #pragma omp parallel default(n
在我学习 OpenMP 的过程中,我遇到了一个示例,其中的主要内容如下所示: int main(){ #pragma omp parallel #pragma omp sing
我是 OpenMP 的新手,我一直在尝试运行一个使用 OpenMP 添加两个数组的程序。在 OpenMP 教程中,我了解到,在 for 循环上使用 OpenMP 时,我们需要使用 #pragma om
我正在阅读 Peter S. Pacheco 的《并行编程简介》一书。在第 5.6.2 节中,它对减少 fork/join 开销进行了有趣的讨论。 考虑奇偶转置排序算法: for(phase=0; p
之间有什么区别: #pragma omp for {for_loop} 和 #pragma omp parallel for {for_loop} 最佳答案 #pragma omp par
在 OpenMP 中 #pragma omp master 中的任何代码指令由单个线程(主线程)执行,在区域末尾没有隐含的屏障。 (见 section on MASTER directive in t
如果我明白 aligned omp simd的条款构造,它指的是整个数组的对齐方式。 它如何用于多维数组?认为 ni = 131; nj = 137; nk = 127 !allocates arr
我有一个问题:我必须使用 OMP 并行化这段代码。 存在数据依赖问题,不知道如何解决。有什么建议么? for (n = 2; n < N+1; n++) { dz = *(dynamic_d +
我是一名优秀的程序员,十分优秀!