基于任务的编程:#pragma omp task 与 #pragma omp parallel for

2024-04-24

考虑到:

    void saxpy_worksharing(float* x, float* y, float a, int N) {
      #pragma omp parallel for
      for (int i = 0; i < N; i++) {
         y[i] = y[i]+a*x[i];
      }
    }

And

    void saxpy_tasks(float* x, float* y, float a, int N) {
      #pragma omp parallel
      {
         for (int i = 0; i < N; i++) {
         #pragma omp task
         {
           y[i] = y[i]+a*x[i];
         }
      }
   }

使用任务和 omp 并行指令有什么区别?为什么我们可以用任务来编写递归算法,例如合并排序,但不能用工作共享来编写?


我建议您看一下劳伦斯利弗莫尔国家实验室的 OpenMP 教程,可用here https://hpc-tutorials.llnl.gov/openmp/.

你的具体例子应该是not使用 OpenMP 任务来实现。第二个代码创建N乘以线程任务数(因为除了缺少的代码之外,代码中还有错误};我稍后会回来讨论),并且每个任务仅执行非常简单的计算。正如您在我的回答中看到的那样,任务的开销将是巨大的这个问题 https://stackoverflow.com/questions/13034718/producer-consumer-using-openmp-tasks。此外,第二个代码在概念上是错误的。由于没有工作共享指令,所有线程都将执行循环的所有迭代,而不是N tasks, N创建的线程任务数的倍数。应通过以下方式之一重写:

单任务生产者 - 常见模式,NUMA 不友好:

void saxpy_tasks(float* x, float* y, float a, int N) {
   #pragma omp parallel
   {
      #pragma omp single
      {
         for (int i = 0; i < N; i++)
            #pragma omp task
            {
               y[i] = y[i]+a*x[i];
            }
      }
   }
}

The single指令将使循环仅在单个线程内运行。所有其他线程都会跳过它并在结束时遇到隐式屏障single构造。由于屏障包含隐式任务调度点,等待线程将在任务可用时立即开始处理任务。

并行任务生成器 - 对 NUMA 更友好:

void saxpy_tasks(float* x, float* y, float a, int N) {
   #pragma omp parallel
   {
      #pragma omp for
      for (int i = 0; i < N; i++)
         #pragma omp task
         {
            y[i] = y[i]+a*x[i];
         }
   }
}

在这种情况下,任务创建循环将在线程之间共享。

如果你不知道什么是 NUMA,请忽略有关 NUMA 友好性的评论。

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

基于任务的编程:#pragma omp task 与 #pragma omp parallel for 的相关文章

  • 如何通过 async/await 找到哪个方法“挂起”?

    在 旧 时代 跟踪哪个方法挂起非常容易 只需转到调试器 点击 暂停 按钮并查看堆栈跟踪即可 然而 现在 如果问题出在异步方法中 则这种方法不起作用 因为要执行的下一段代码被埋在延续任务中的某个地方 从技术上讲 它甚至不会挂起 有没有办法这样
  • 如何模拟 Android `Tasks.await()`?

    因此 我正在编写一个方法来对与 Firebase 身份验证的交互进行单元测试 我已成功模拟了所需的所有其他内容 但我不确定如何模拟被测方法中的调用Tasks await someTask someValue Because Tasks aw
  • 从“最近的应用程序”启动应用程序和点击应用程序图标有什么区别

    我正在开发大型项目 因此有一些逻辑可以保存应用程序状态 然后在来自后台时打开正确的活动 片段 但无论如何 我发现如果用户浏览我的应用程序然后最小化它 android 在以下情况下会以不同的方式从后台打开它 用户点击应用程序图标 行为 当应用
  • c openmp并行用于并行区域内

    我的问题是这样的one https stackoverflow com questions 11493265 for loop inside parallel region 但我想做一些不同的事情 例如 在我的并行区域内 我想在 4 个线程
  • Qt 支持 OpenMP 吗?

    我在 Visual Studio 项目中使用 OpenMP 目前非常认真地考虑更改为 QT Creator Visual Studio 不是很糟糕吗 我对微软的期望更高 但无论如何 QT Creator 支持 OpenMP 吗 如果出现这种
  • OpenMp 根据变量设置并行循环的线程数

    有没有办法根据变量的值设置 OpenMP 并行区域的线程数 最初 整个应用程序的线程数 nofCores 在我的 AMD FX 8350 上 nofCores 8 对于这个区域 如果变量是 3 那么我只需要 3 个线程 如果变量 gt 核心
  • 我应该如何将返回非通用任务的函数转换为 ValueTask?

    我正在编写一些代码 它在内存中构建一个缓冲区 然后将其清空到TextWriter当缓冲区填满时 大多数时候 角色会直接进入缓冲区 同步 但偶尔 每 4kb 一次 我需要调用TextWriter WriteAsync In the Syste
  • gcc 自动矢量化(未处理的数据引用)

    我不明白为什么这样的代码没有用 gcc 4 4 6 进行矢量化 int MyFunc const float pfTab float pfResult int iSize int iIndex for int i 0 i lt iSize
  • Task.IsCancelled 不起作用

    我有以下示例代码 static class Program static void Main var cts new CancellationTokenSource var task Task Factory StartNew gt try
  • 如何处理Task.Run异常

    我在捕获异常时遇到问题Task Run这是通过更改代码解决的 如下所示 我想知道这两种方式处理异常之间的区别 In the Outside方法我无法捕获异常 但是在Inside方法我可以 void Outside try Task Run
  • 如何限制创建 celery 任务的速度快于消耗速度的脚本?

    我有一个脚本可以生成数百万个 Celery 任务 数据库中每行一个任务 有没有办法限制它 以免它完全淹没芹菜 理想情况下 我想让 Celery 保持忙碌 但我不希望 Celery 队列的长度超过几十个任务 因为这只是浪费内存 特别是因为如果
  • OpenMP 因大型数组而崩溃

    我正在使用 Fortran 和 OpenMP 但当我尝试在存在大型数组时使用 OpenMP 并行化循环时 我不断遇到问题 例如 以下代码 PROGRAM main IMPLICIT NONE INTEGER PARAMETER NUMLOO
  • 测量 OpenMP Fork/Join 延迟

    由于 MPI 3 具有共享内存并行功能 并且它似乎与我的应用程序完美匹配 因此我正在认真考虑将我的混合 OpemMP MPI 代码重写为纯 MPI 实现 为了给棺材里钉上最后一颗钉子 我决定运行一个小程序来测试 OpenMP fork jo
  • 仅当 gradle 中另一个任务不是最新时才运行任务

    我想在 Gradle 中进行功能测试时自动添加 serverRun 任务 因此我添加了一个依赖项 funcTestTask dependsOn serverRun 无论 funcTestTask 是否运行 任务都会运行 compile se
  • Pthreads 与 OpenMP

    我正在使用 Linux 用 C 创建一个多线程应用程序 我不确定是否应该使用 POSIX 线程 API 还是 OpenMP API 使用两者有何优缺点 Edit 有人可以澄清这两个 API 是否创建内核级 or 用户级线程 Pthreads
  • C++ OpenMP:嵌套循环,其中内部迭代器依赖于外部迭代器

    考虑以下代码 include
  • 在特定时间启动应用程序

    我想知道是否有可能 以及如何 在特定时间启动我的应用程序 就像在特定时间响起的闹钟一样 假设我希望我的应用程序在早上 8 点启动 这可行吗 您可以使用 AlarmManager 来完成此操作 这是一个简短的示例 首先你需要设置闹钟 Alar
  • 如何判断 OpenMP 是否正常工作?

    我正在尝试以并行模式运行 LIBSVM 但我的问题一般是在 OpenMP 中 根据LIBSVM 常见问题解答 http www csie ntu edu tw cjlin libsvm faq html f432 我已使用 pragma 调
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • Gradle创建多项目Jar

    因此 从 Gradle 和 Android Studio 诞生之初起 我就一直在使用它们 然而 我发现自己用头撞墙的次数有时远远超过了它的价值 我花了一天半的时间试图解决我目前的困境 在我工作的地方 我们使用很多共享库项目 这意味着与 Gr

随机推荐

  • 将 r 中的数据帧转换为事务或 itemMatrix?

    我有一个数据data frame我想将其转换成的格式transactions or an itemMatrix 检查功能arules支持这两种数据格式这就是我问这个问题的原因 library arules 示例 1 从矩阵创建交易 a ma
  • 如何在primeng自动完成角度8中对建议嵌套列表进行分组

    我正在尝试对自动完成建议进行分组 并希望在 primeng 中呈现它们 我们如何在primeng中添加自定义模板 my data data id m1 name menu1 val D items id d1 name datanested
  • 修复重载运算符“+”的使用不明确?

    我使用 C 11 标准编写了以下代码 h file include Auxiliaries h class IntMatrix private Dimensions dimensions int data public int size c
  • Cocoa 脚本:返回“null”与“缺失值”

    看来 AppleScript 知道这个特殊值null 如何从基于 Cocoa 脚本的应用程序中为可编写脚本的属性返回这样的值 如果我回来nil NULL or NSNull对于来自我的基于 Cocoa 脚本的应用程序的可编写脚本的属性 ge
  • Bootstrap 右栏位于移动视图顶部

    我有一个像这样的引导页面 div class row div class col md 6 A div div class col md 6 B div div 好像 A B 因此 如果我在移动设备上查看它 A 列位于顶部 但我希望 B 列
  • 正则表达式大于零,保留 2 位小数

    我需要一个正则表达式来表示最多两位小数大于零的数值 并且个数列中可能有也可能没有零 我还应该添加 整数就可以了 请参阅下面的一些内容 但可能存在前导或尾随空格 Good values 1 0 1 1 12 123 12 92 092 092
  • 修复无效 JSON 的正则表达式

    我正在对服务进行 API 调用 但它返回无效的 JSON photo url 字段没有将 url 封装在引号中 我将它作为字符串 并尝试编写一个正则表达式来在 url 周围添加引号 我使用 Titanium 在 Javascript 中完成
  • XAMPP - 对于表“users”,用户“@”localhost”的 SELECT 命令被拒绝

    不久前 我删除并弄乱了 XAMPP 中的一些功能 我重新安装了它 并移动 重命名了我的文件夹和所有其他文件 所以我现在有了一个新的空的 xampp 目录 但是 当我尝试使用任何数据库功能时 它会出现如下错误 SELECT command d
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • AngularFireDatabase 不检索数据

    每当我使用 afDB list path 方法时 我都会得到以下信息 console log this items https i stack imgur com RtwkN png 我有这个例子作为我的 firebase 数据库 列表文件
  • 如何在ZF2控制器中获取baseUrl?

    在我的 zf2 控制器中 我想检索应用程序基本 URL 例如http example com 我尝试了以下调用 但它返回一个空字符串 this gt request gt getBasePath 我怎样才能得到http example co
  • QNetworkManager 默认情况下是否接受压缩回复?

    我在用Q网络管理器 https doc qt io qt qnetworkaccessmanager html从服务器获取文件 但是我不知道文件在传输过程中是否使用标准 gzip 压缩进行压缩 如果不是 如何让它们下载压缩文件 我该如何去检
  • C# 中密封类的扩展方法

    我有这个sealed class public sealed class A public string AName get set 有人可以为它编写一个扩展方法 如下所示 public static class Extensions pu
  • 如果我解决了冲突,Git 的责备会改变吗?

    我试图弄清楚合并冲突是否导致了错误 但我遇到了困难 因为我不清楚冲突解决如何影响git blame 假设我在 master 中有一个文件 a b c 我在master中修改 a d c 但同事也是如此 他们在一个单独的分支中以不同的方式对其
  • 如何将输入作为 stdin 通过管道传输到 src_block ?

    考虑 org babel 中的以下 perl 片段 它使用
  • 点击时反应获取id值

    我有以下内容 var SingleEditableModule React createClass show overlay function e console log e target attr id render function v
  • Asp.net core 2.0条件服务或条件连接字符串

    我正在使用 Asp net core 2 0 开发 Web api 现在我需要的是使用不同的连接字符串 这些字符串将在用户的标头中指定 我以前见过这个 不是直接关于这个问题 app Use async context next gt if
  • 在 ArrayAdapter 中显示自定义对象 - 简单的方法?

    我正在尝试显示蓝牙设备列表ArrayAdapter 并且想要覆盖适配器的默认功能以显示对象toString 我知道有一些解决方案可以扩展getView 方法 但我真的觉得这太复杂了 我想要的只是覆盖要显示的字符串的构建方式 对于蓝牙设备 这
  • 在 WPF 中创建平面按钮

    如何在wpf中制作按钮平面样式 我已经尝试过 BasedOn 属性 但它不起作用 这里使用已经定义的工具栏按钮样式更简单的解决方案
  • 基于任务的编程:#pragma omp task 与 #pragma omp parallel for

    考虑到 void saxpy worksharing float x float y float a int N pragma omp parallel for for int i 0 i lt N i y i y i a x i And