OpenMP:将所有线程分为不同的组

2023-12-26

我想将所有线程分为 2 个不同的组,因为我有两个并行任务要异步运行。例如,如果总共有 8 个线程可用,我希望有 6 个线程专用于任务 1,另外 2 个线程专用于任务 2。

如何使用 OpenMP 实现这一目标?


这是一份工作OpenMP 嵌套并行性 http://docs.oracle.com/cd/E19205-01/819-5270/aewbc/index.html,从 OpenMP 3 开始:您可以使用OpenMP 任务 http://docs.oracle.com/cd/E19205-01/820-7883/6nj43o69j/index.html启动两个独立的任务,然后在这些任务中使用适当数量的线程的并行部分。

举个简单的例子:

#include <stdio.h>
#include <omp.h>

int main(int argc, char **argv) {

    omp_set_nested(1);   /* make sure nested parallism is on */
    int nprocs = omp_get_num_procs();
    int nthreads1 = nprocs/3;
    int nthreads2 = nprocs - nthreads1;

    #pragma omp parallel default(none) shared(nthreads1, nthreads2) num_threads(2)
    #pragma omp single
    {
        #pragma omp task
        #pragma omp parallel for num_threads(nthreads1)
        for (int i=0; i<16; i++)
            printf("Task 1: thread %d of the %d children of %d: handling iter %d\n",
                        omp_get_thread_num(), omp_get_team_size(2),
                        omp_get_ancestor_thread_num(1), i);
        #pragma omp task
        #pragma omp parallel for num_threads(nthreads2)
        for (int j=0; j<16; j++)
            printf("Task 2: thread %d of the %d children of %d: handling iter %d\n",
                        omp_get_thread_num(), omp_get_team_size(2),
                        omp_get_ancestor_thread_num(1), j);
    }

    return 0;
}

在 8 核(16 个硬件线程)节点上运行它,

$ gcc -fopenmp nested.c -o nested -std=c99
$ ./nested
Task 2: thread 3 of the 11 children of 0: handling iter 6
Task 2: thread 3 of the 11 children of 0: handling iter 7
Task 2: thread 1 of the 11 children of 0: handling iter 2
Task 2: thread 1 of the 11 children of 0: handling iter 3
Task 1: thread 2 of the 5 children of 1: handling iter 8
Task 1: thread 2 of the 5 children of 1: handling iter 9
Task 1: thread 2 of the 5 children of 1: handling iter 10
Task 1: thread 2 of the 5 children of 1: handling iter 11
Task 2: thread 6 of the 11 children of 0: handling iter 12
Task 2: thread 6 of the 11 children of 0: handling iter 13
Task 1: thread 0 of the 5 children of 1: handling iter 0
Task 1: thread 0 of the 5 children of 1: handling iter 1
Task 1: thread 0 of the 5 children of 1: handling iter 2
Task 1: thread 0 of the 5 children of 1: handling iter 3
Task 2: thread 5 of the 11 children of 0: handling iter 10
Task 2: thread 5 of the 11 children of 0: handling iter 11
Task 2: thread 0 of the 11 children of 0: handling iter 0
Task 2: thread 0 of the 11 children of 0: handling iter 1
Task 2: thread 2 of the 11 children of 0: handling iter 4
Task 2: thread 2 of the 11 children of 0: handling iter 5
Task 1: thread 1 of the 5 children of 1: handling iter 4
Task 2: thread 4 of the 11 children of 0: handling iter 8
Task 2: thread 4 of the 11 children of 0: handling iter 9
Task 1: thread 3 of the 5 children of 1: handling iter 12
Task 1: thread 3 of the 5 children of 1: handling iter 13
Task 1: thread 3 of the 5 children of 1: handling iter 14
Task 2: thread 7 of the 11 children of 0: handling iter 14
Task 2: thread 7 of the 11 children of 0: handling iter 15
Task 1: thread 1 of the 5 children of 1: handling iter 5
Task 1: thread 1 of the 5 children of 1: handling iter 6
Task 1: thread 1 of the 5 children of 1: handling iter 7
Task 1: thread 3 of the 5 children of 1: handling iter 15

Updated:我已经更改了上面的内容以包含线程祖先;出现了混乱,因为(例如)打印了两个“线程 1” - 这里我还打印了祖先(例如,“1 的 5 个子级的线程 1”与“0 的 11 个子级的线程 1”) ”)。

来自OpenMP 标准 http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf,S.3.2.4,“omp_get_thread_num例程返回线程号,目前团队内,调用线程的。”,以及第 2.5 节,“当一个线程遇到并行构造时,会创建一组线程来 执行并行区域 [...] 遇到并行构造的线程 成为新团队的主线程,线程数为零 新并行区域的持续时间。

也就是说,在每个(嵌套)并行区域内,都会创建线程组,其线程 ID 从零开始;但仅仅因为这些 ID 在团队内重叠并不意味着它们是相同的线程。在这里,我也通过打印它们的祖先编号来强调这一点,但如果线程正在执行 CPU 密集型工作,您还会通过监视工具看到确实有 16 个活动线程,而不仅仅是 11 个。

它们是团队本地线程号而不是全局唯一线程号的原因非常简单;在可能发生嵌套和动态并行的环境中,几乎不可能跟踪全局唯一的线程号。假设有三组线程,编号为 [0..5]、[6,..10] 和 [11..15],中间组完成。我们是否在线程编号中留下间隙?我们是否要中断所有线程来更改它们的全局编号?如果启动一个新团队,有 7 个线程怎么办?我们是从 6 开始并有重叠的线程 ID,还是从 16 开始并在编号中留下间隙?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMP:将所有线程分为不同的组 的相关文章

  • 分组和计数以获得接近值

    我想计算每country的次数status is open以及次数status is closed 然后计算closerate per country Data customer lt c 1 2 3 4 5 6 7 8 9 country
  • 断点会停止所有线程吗?

    如果我的程序中有两个线程同时运行 并在其中一个线程上设置了断点 那么当遇到此断点时 另一个线程也会停止 还是会继续执行 我用 Java 编写并使用 NetBeans 断点可以选择它们的行为方式 挂起单个线程或所有线程
  • 使用 boost::thread 特定的 ptr<>::get() 是否会很慢?有什么解决方法吗?

    我目前正在使用 Valgrind 的 Callgrind 分析一个存在性能问题的应用程序 在查看分析数据时 似乎有 25 的处理时间花费在boost detail get tss data在主要目的是物理模拟和可视化的应用程序中 get t
  • 通过推送通知唤醒

    Suppose 有一些对象 例如 一个数组a 和依赖于对象的条件 例如 a empty 当前线程以外的某些线程可以操作该对象 a 因此条件评估值的真实性会随着时间的推移而变化 如何让当前线程在代码中的某个时刻休眠 并在条件满足时通过推送通知
  • 如何限制Erlang VM(BEAM)使用的核心数量?

    我正在具有 2 个四核 Xeon E5520 2 2GHz 24 0GB RAM 和 Erlang R15B02 启用 SMP 的节点上运行实验 我想知道是否可以限制Erlang VM使用的核心数量 以便我可以暂时禁用一些核心并逐步增加数量
  • 除非在后台线程中获取新的引用,否则存在潜在的引用计数问题

    我有一个second https stackoverflow com questions 28898966 prefer property accessor or kvc style for accessing core data prop
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • C# WinForms:使用一个或多个附加线程进行绘图。如何?

    如果我有一张包含各种几何形式 直线 矩形 圆形等 的大图 线程需要花费大量时间来绘制所有内容 但在现实生活中 一栋建筑是由不止一名工人建造的 因此 如果绘图是建筑物而线程是构建者 则绘制速度会快得多 但我想知道怎么做 你能告诉我怎么做吗 有
  • 在 Python 中打印守护线程异常

    Python 不会打印守护线程中引发的异常的回溯消息 例如 以下代码创建一个守护线程并在新线程中引发异常 def error raiser raise Exception import threading thread threading
  • 在不支持线程的程序加载的共享库中使用 C++11 多线程

    我目前正在尝试在共享库中使用 C 11 多线程 该库加载到 Linux 上的主程序 用 C 编写 中 这是一个大型模拟程序的一部分 我无法更改有关库加载的任何内容或更改一般的主程序 主程序是用 gcc 4 1 2 编译的 我没有它的源代码
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 导致崩溃转储的 Java 错误的解决方法

    我开发的一个程序偶尔会由于这个错误而导致 JVM 崩溃 http bugs java com bugdatabase view bug do bug id 8029516 http bugs java com bugdatabase vie
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 调用线程无法访问该对象,因为另一个线程拥有它

    我已经阅读了很多关于此错误的帖子 但我不明白如何在我的解决方案中解决它 我有一个进度条对话框 其中包含一些逻辑 通过按钮单击从 MainFrame 调用 void OnBtnClick object sender RoutedEventAr
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • 通过 ruby​​ 进程共享变量

    我正在编写一个 gem 其中我必须分叉两个进程来启动两个 webrick 服务器 我想通过基类的类方法启动该服务器 因为应该只运行这两个服务器 而不是多个服务器 在运行时 我想调用这两台服务器上的一些方法来更改变量 我的问题是 我无法通过基
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和

随机推荐

  • 如何使用mock来模拟一个新对象

    我正在尝试使用mockk 编写单元测试 我试图弄清楚如何模拟对象的新实例 例如 使用 PowerMockito 我们可以这样写 PowerMockito whenNew Dog class java withArguments beagle
  • 如何更改 JSON 中字段的顺序

    Scenario 考虑我有一个 JSON 文档 如下所示 name David age 78 NoOfVisits 4 问题 我想更改文档中字段的顺序 顺序 比如说我想要age NoOfVisits然后最后name 截至目前 我将值存储在临
  • 业务对象/数据库访问层的体系结构

    由于各种原因 我们正在编写一个新的业务对象 数据存储库 该层的要求之一是将业务规则的逻辑与实际的数据存储层分开 可以有多个数据存储层实现对同一对象的访问 例如 实现大多数对象的主 数据库 数据存储源 以及实现用户对象的另一个 ldap 源
  • Reinterpret_cast 与 C 风格强制转换

    我听到了reinterpret cast是实现定义的 但我不知道这真正意味着什么 你能提供一个例子来说明它是如何出错的吗 如果出错了 使用 C 风格的强制转换是否更好 C型演员阵容也好不到哪儿去 它只是按顺序尝试各种 C 风格的转换 直到找
  • 在 C# 中的其他类的列表中添加和删除项目

    我正在使用表单在 C 中设置一个基本的购物车 我已将一些产品加载到 List 中 打开时可以显示这些产品 但我的问题是 当我从 List 添加或删除项目并退出菜单并再次打开商店时 会显示原始列表 我不确定如何在商店中添加或删除它 它也显示在
  • 查找特定 JDK 版本的“示例和演示”[已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Oracle 发布了 Java SE 开发套件 8u20 演示和示例下载 最新发布 http www o
  • 将 Angular2 组件转换为 ES6 语法需要什么?

    index js 这是我的切入点 import as stylesheet from assets styles app scss import jQuery from node modules jquery dist jquery imp
  • 带有模板容器的模板类

    如何声明具有不同容器作为模板参数的模板类 适配器 例如 我需要声明类 template
  • Delphi 2009 在 RAD Studio 命令提示符中使用 MSBuild F1026 文件未找到

    在过去的几天里 我一直在努力让 MSBuild 在构建机器上成功构建我的 dproj 文件 首先 我需要来自开发人员计算机的 EnvOptions proj 文件 这让我清除了丢失的 system pas 文件 但现在我收到了缺少 dcu
  • Matplotlib 交互式事件循环

    Matplotlib 如何为 Qt 等后端库设置事件循环 同时仍然允许通过 python REPL 进行交互 至少对于 Qt 来说 主事件循环必须在主线程中运行 但这就是 REPL 所在的位置 对吧 所以我正在努力了解两者如何共存 我当前的
  • 如何获取Keras中预测错误数据的索引?

    我正在做情感分析并使用 keras 来预测电影评论的正面 负面 我想知道的是原始数据 这些数据是我的模型错误预测的 我只能从模型中获得准确性和损失 但我想获得模型预测错误的文本子集 怎么做 import pandas as pd from
  • Jquery datepicker 2个月显示

    我正在使用 jquery ui 日期选择器来显示多个月份 弹出窗口将这些月份显示在其他月份的下方 有没有办法让下个月显示在右侧 我现在正在 datePicker 中处理这个 所以 根据 jQuery datePicker 文档 number
  • 如何从 Jinja2 模板中获取所有未定义的变量?

    我试图从 Jinja2 模板中获取所有未定义的变量 假设我有一个如下所示的模板 tmpstr for row in csv sample row field1 stuff row field2 morestuff row field3 en
  • 如何使用 maven-scala 插件解决依赖项的“错误:错误的符号引用”?

    我正在使用 Scala 和 Slick 构建一个小型数据库查询实用程序 并使用 Maven 作为构建和打包工具 我的代码编译时没有任何语法错误 但构建失败并出现以下错误 INFO maven scala plugin 2 15 0 comp
  • 如何发送和接收广播消息

    我正在尝试在选项卡内的两个活动之间传递数据 我正在尝试使用sendBroadcast 设置断点后我永远不会到达onReceive 显现
  • JavaScript 错误 - 无法调用 null 的方法“appendChild”

    我是 Javascript 以及一般编程 的新手 一直在尝试基本掌握 DOM 的使用 如果这是一个非常基本的错误 我深表歉意 但我环顾四周 找不到答案 我正在尝试使用appendChild方法将标题和一些段落文本添加到下面非常基本的HTML
  • java.lang.IllegalArgumentException:观察者为空

    我的一个应用程序的用户报告了此错误 我对这意味着什么以及如何解决它感到困惑 经过一番谷歌搜索后 仍然没有运气 有人以前见过这个或者知道如何解决它吗 java lang IllegalArgumentException The observe
  • VS 2019 的终端在哪里?

    我正在运行 16 3 4 所以我认为它应该已经包含早期预览版本的更新 这里提到 https devblogs microsoft com visualstudio say hello to the new visual studio ter
  • xreadlines 和 for 循环文件之间的区别

    在 Python 2 7 中有一个文件对象 f open my file r for 循环文件 最常见的方式 和使用xreadlines 功能 for line in f Do something with line and for lin
  • OpenMP:将所有线程分为不同的组

    我想将所有线程分为 2 个不同的组 因为我有两个并行任务要异步运行 例如 如果总共有 8 个线程可用 我希望有 6 个线程专用于任务 1 另外 2 个线程专用于任务 2 如何使用 OpenMP 实现这一目标 这是一份工作OpenMP 嵌套并