- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码:
#include <cstdio>
#include "omp.h"
int main() {
omp_set_num_threads(4);
#pragma omp parallel
{
#pragma omp parallel for
for (int i = 0; i < 6; i++)
{
printf("i = %d, I am Thread %d\n", i, omp_get_thread_num());
}
}
return 0;
}
我得到的输出:
i = 0, I am Thread 0
i = 1, I am Thread 0
i = 2, I am Thread 0
i = 0, I am Thread 0
i = 1, I am Thread 0
i = 0, I am Thread 0
i = 1, I am Thread 0
i = 2, I am Thread 0
i = 2, I am Thread 0
i = 3, I am Thread 0
i = 0, I am Thread 0
i = 1, I am Thread 0
i = 3, I am Thread 0
i = 4, I am Thread 0
i = 5, I am Thread 0
i = 2, I am Thread 0
i = 3, I am Thread 0
i = 4, I am Thread 0
i = 5, I am Thread 0
i = 3, I am Thread 0
i = 4, I am Thread 0
i = 5, I am Thread 0
i = 4, I am Thread 0
i = 5, I am Thread 0
添加“并行”是问题的原因,但我不知道如何解释。
最佳答案
默认情况下,nested parallelism
是 已禁用 .尽管如此,您可以明确 启用 nested parallelism
,通过:
omp_set_nested(1);
或通过设置
OMP_NESTED环境变量为真。
When a thread encounters a parallel construct, a team of threads iscreated to execute the parallel region.The thread that encountered the parallel construct becomesthe master thread of the new team, with a thread number of zero forthe duration of the new parallel region. All threads in the new team,including the master thread, execute the region. Once the team iscreated, the number of threads in the team remains constant for theduration of that parallel region.
OpenMP parallel regions can be nested inside each other. If nestedparallelism is disabled, then the new team created by a threadencountering a parallel construct inside a parallel region consistsonly of the encountering thread. If nested parallelism is enabled,then the new team may consist of more than one thread.
parallel region
的原因。每个团队只有一个线程执行封闭代码(即 for 循环)。换句话说,从第一个
parallel region
,
4
创建线程,当遇到第二个
parallel region
时,每个线程都会被创建。将创建一个新团队并成为该团队的主人(即,将在新创建的团队中拥有
ID=0
)。
但是,由于您没有明确启用嵌套并行性,因此每个团队仅由一个线程 组成。 .因此,
4
各有一个线程的团队将执行 for 循环。因此,您将得到以下语句:
printf("i = %d, I am Thread %d\n", i, omp_get_thread_num());
正在打印
6 x 4 = 24 times
(即,循环迭代总数乘以
4
团队中的线程总数)。下图提供了该流程的可视化:
printf
第一个和第二个之间的语句
parallel region
, 如下:
int main() {
omp_set_num_threads(4);
#pragma omp parallel
{
printf("Before nested parallel region: I am Thread{%d}\n", omp_get_thread_num());
#pragma omp parallel for // Adding "parallel" is the cause of the problem, but I don't know how to explain it.
for (int i = 0; i < 6; i++)
{
printf("i = %d, I am Thread %d\n", i, omp_get_thread_num());
}
}
return 0;
}
您将得到类似于以下输出的内容(请记住,输出第一个
4
行的顺序是不确定的)。
Before nested parallel region: I am Thread{1}
Before nested parallel region: I am Thread{0}
Before nested parallel region: I am Thread{2}
Before nested parallel region: I am Thread{3}
i = 0, I am Thread 0
i = 0, I am Thread 0
i = 0, I am Thread 0
(...)
i = 5, I am Thread 0
意思是在第一个
parallel region
内(但仍然在第二个并行区域之外)有一个由 4 个线程组成的团队——
IDs
来自
0
至
3
——并行执行。因此,这些线程中的每一个都将执行
printf
陈述:
printf("I am Thread outside the nested region {%d}\n", omp_get_thread_num());
并为
omp_get_thread_num()
显示不同的值方法调用。
parallel region
时,每个人都会创建一个新团队并成为主人(即,将在新创建的团队中拥有
ID=0
)。 —— 也是唯一的成员 —— 该团队的成员。因此,为什么声明
printf("i = %d, I am Thread %d\n", i, omp_get_thread_num());
在循环内,总是输出
(..) I am Thread 0
, 由于方法
omp_get_thread_num()
在这种情况下将始终返回
0
.然而,即使方法
omp_get_thread_num()
正在返回
0
,这并不意味着代码是连续执行的(由带有
ID=0
的线程执行),而是每个
4
的每个主节点的每个主节点。团队正在返回他们的
ID=0
.
1
至
3
为简单起见省略了,但它与线程 0 相同。
parallel region
, 团队与
4
线程被创建。以后遇到下
parallel region
来自前一个团队的每个线程,将创建一个新团队
4
每个线程,所以目前我们总共有
16
跨线程
4
团队。最后,每个团队将执行整个 for 循环。但是,因为您有一个
#pragma omp parallel for
构造函数,for 循环的迭代将在每个团队内的线程之间分配。
static
循环之间迭代的循环分布,我并不是暗示循环迭代将始终在 OpenMP 标准的所有实现中像这样划分。
关于c - 嵌套并行度 : Why only the main thread runs and executes the parallel for loop four times?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65119234/
有时我一直在努力理解为什么在尝试创建航路点任务时任务管理器会收到错误“无法执行执行”。我附上了我正在使用的工作流程,如果您能看一下,我将不胜感激。 1.Initialize FlightControl
我正在 Python 中使用 SQLAlchemy 核心,并且我已多次阅读文档,但仍然需要有关 engine.execute() 的说明。与 connection.execute() . 据我了解,e
在我的 Zend 框架项目中,我想检查是否设置了 cookie。如果是这种情况,我想使用 cookie 内容登录用户。 由于我必须在调用任何 Controller 之前执行此自动登录,因此我尝试将其放
我正在尝试为我创建的 2 个选择语句的 UNION 创建一个 View 。 UNION 在单独执行时工作正常 但问题是当我将它作为 View 执行时,只有 UNION 的第一部分被执行。 我正在使用的
下面我写了一个简单的例子来演示我遇到的问题。执行代码后,我得到一个 cygwin 异常 7200。我环顾四周并尝试了一些事情,但没有解决。有人可以解释为什么我得到它,我该如何解决?感谢您抽出宝贵时间,
从池中获取连接然后在连接上调用 execute 而不是直接在池对象上调用 execute 的用例是什么? 在 Pool 的文档中类,显示此示例: con = await pool.acquire()
我正在尝试通过 SQL 将变量中的 2 个值插入表中,代码完成时没有错误,但条目未显示在表中。 我尝试在即时窗口中执行代码,但这给了我一个关于括号的错误(我真的不知道如何在那里正确输入提示),所以我将
我对广播接收器有点困惑。我有一个广播接收器,它在 TIME_SET 和 TIMEZONE_CHANGED 操作时触发(代码在下面给出)。我想知道的是,当 TIME_SET 和 TIMEZONE_CHA
我必须与需要随每个请求发送访问 token 的外部服务集成。访问 token 的到期时间很短(只有几个小时)。我决定以乐观的方式使用访问 token 。我将使用当前 token 调用外部服务。如果出现
如果我在 swift 中运行以下代码,步骤 1.、2.、3. 和 4. 是否始终按此顺序执行(它们应该如此),或者如果循环存在异步执行的风险,排序等,花费的时间比预期的要长? // 1. fo
我在我的 C++ 应用程序中看到访问冲突错误。在发生违规并使用 !analyze 时将 windbg 附加到进程时,我发现访问违规是由于试图执行不可执行的地址。我知道导致此问题的正在执行的地址。什么可
在使用 Ubuntu 大约一年之后,这对我来说是第一次。 我接手了一个跟踪维修的汽车服务项目。我可以看到每个文件的完整源代码,但是有一个没有扩展名的文件,但在 Ubuntu 中,属性显示为可执行文件(
什么是 LinqPad“自动跟踪执行”和“跳转到执行点”?如何使用它们,如果你能给出一个详细的例子将不胜感激。 最佳答案 这不是一个详细的示例,但它说明了该功能。如果你有一个像 "1".Dump()
我使用 Q.js 来实现 promise 。在下面的代码中,每个方法都会进行 ajax 调用,然后返回一个 Promise。一切都按预期进行,每个方法在下一个方法开始之前执行并完成: function
我有一个类,它实现了 Runnable接口(interface),并且是一个一旦启动就会无限期运行的任务(长时间运行的线程)。 public class LongRunningTask impleme
PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: 无效的参数数量:绑定(bind)变量的数量与标记数量不匹配 我收到此错
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
想要为执行的每个 linux 命令添加 aspect:executionTime 有什么方法可以添加默认方面环境,以便必须为执行的 linux 命令获取 executionTime 最佳答案 根据 m
我正在尝试安装一个名为 MFOC 的工具.我按照其网站中提到的说明进行操作,如下所示: ebrahim@ubuntu:~$ cd Desktop/mfoc-master/ ebrahim@ubuntu
我刚开始使用 numba 来提高我的程序的性能。我已经减少了我将要呈现的情况 import numba as nb import numpy as np from time import time d
我是一名优秀的程序员,十分优秀!