OPENMP F90/95 嵌套 DO 循环 - 串行实现的问题得到改进

2023-12-14

我已经进行了一些搜索,但找不到任何与我的问题相关的内容(很抱歉,如果我的问题是多余的!)。无论如何,正如标题所述,我在代码的串行实现方面无法获得任何改进。我需要并行化的代码片段如下(这是带有 OpenMP 的 Fortran90):

do n=1,lm     
  do m=1,jm   
    do l=1,im      
      sum_u = 0
      sum_v = 0
      sum_t = 0
      do k=1,lm
       !$omp parallel do reduction (+:sum_u,sum_v,sum_t) 
        do j=1,jm  
          do i=1,im
            exp_smoother=exp(-(abs(i-l)/hzscl)-(abs(j-m)/hzscl)-(abs(k-n)/vscl))
            sum_u = sum_u + u_p(i,j,k) * exp_smoother
            sum_v = sum_v + v_p(i,j,k) * exp_smoother
            sum_t = sum_t + t_p(i,j,k) * exp_smoother

            sum_u_pert(l,m,n) = sum_u
            sum_v_pert(l,m,n) = sum_v
            sum_t_pert(l,m,n) = sum_t          

            end do
          end do
       end do      
    end do
  end do  
end do

我遇到了竞争条件问题吗?或者我只是把指令放在了错误的地方?我对此还很陌生,所以如果这是一个过于简单的问题,我深表歉意。

不管怎样,如果没有并行化,代码就会极其缓慢。为了了解问题的规模,lm、jm 和 im 索引分别为 60、401 和 501。因此并行化至关重要。任何帮助或有用资源的链接将不胜感激!我正在使用 xlf 编译上面的代码,如果这有用的话。

谢谢! -仁


放置 omp pragma 的明显位置是最外面的循环。

对于每个 (l,m,n),您都在计算扰动变量和指数平滑器之间的卷积。每个 (l,m,n) 计算都完全独立于其他计算,因此您可以将其放在最外层循环上。例如最简单的事情

!$omp parallel do private(n,m,l,i,j,k,exp_smoother) shared(sum_u_pert,sum_v_pert,sum_t_pert,u_p,v_p,t_p), default(none)
do n=1,lm
  do m=1,jm
    do l=1,im
      do k=1,lm
        do j=1,jm
          do i=1,im
            exp_smoother=exp(-(abs(i-l)/hzscl)-(abs(j-m)/hzscl)-(abs(k-n)/vscl))
            sum_u_pert(l,m,n) = sum_u_pert(l,m,n) + u_p(i,j,k) * exp_smoother
            sum_v_pert(l,m,n) = sum_v_pert(l,m,n) + v_p(i,j,k) * exp_smoother
            sum_t_pert(l,m,n) = sum_t_pert(l,m,n) + t_p(i,j,k) * exp_smoother
          end do
        end do
      end do
    end do
  end do
end do

在 8 核上给我带来约 6 倍的加速(使用大大减少的问题大小 20x41x41)。考虑到循环中要做的工作量,即使是较小的大小,我认为它不是 8 倍加速的原因涉及内存争用或错误共享;为了进一步调整性能,您可能需要显式地将总和数组分解为每个线程的子块,并在最后将它们组合起来;但根据问题的大小,拥有相当于额外的 im x jm x lm 大小的数组可能并不理想。

看起来这个问题有很多结构,你可以利用它来加快串行案例的速度,但说起来更容易找到它;在纸和笔上摆弄,几分钟之内什么也想不出来,但聪明的人可能会发现一些东西。

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

OPENMP F90/95 嵌套 DO 循环 - 串行实现的问题得到改进 的相关文章

  • 带有 For 循环的多维数组 VBA

    尝试检查第一列中的值 即多维数组中的列 如果它匹配 则对另一列中与该行匹配的值进行排序 我认为我做错了 但这是我第一次搞乱多维数组 我是否需要在每个 for 循环中使用 UBound 和 LBound 来告诉它要查看哪一列 除了当前问题的答
  • 如何在 Fortran 90 中迭代包含数字、单词和空格的字符串?

    文件说明 STL文件由以下部分组成 solid
  • 如何在 Ruby 中使用循环输出所有可能的组合?

    我刚刚开始学习编程 并试图编写一个输出所有可能组合的函数 到目前为止 我已经能够找到尺寸 2 的所有可能组合 但我不确定如何使代码保持开放式以处理更大尺寸的组合 某种递归会有用吗 我知道我可以使用内置的组合方法 但我只是想弄清楚如何从头开始
  • 迭代 div 内的输入

    我试图通过 jQuery 迭代放置在特定 div 上的所有输入 但没有响应 我无法使用警报查看输入的值 我究竟做错了什么
  • 在一条语句中对多个变量进行相同的赋值

    有没有一种方法可以为不同的变量分配相同的值 而无需在单个语句中构造数组 例如 如果我有变量a b c d and e 我可以分配类似的东西吗 a b c d e 10 0 我知道我可以用一行来做 a 10 0 b 10 0 c 10 0 d
  • 如果 FIND 函数在 vba 中找不到任何内容,那么[重复]

    这个问题在这里已经有答案了 我目前正在自动化执行以下步骤的手动流程 1 提示用户打开一个数据文件并打开文件 2 插入4列 3 使用文件中已有的数据创建格式为 DD MM YYYY TEXT 的唯一字符串 其中文本是变量 4 使用 if 语句
  • 循环索引依赖于前一个索引

    我有一个清单 fruits apple orange blueberry strawberry 如何创建循环以使一个索引依赖于另一个索引 for i in range len fruits for j range len fruits i
  • Python:使类可迭代

    我继承了一个包含许多大型类的项目 这些类仅由类对象 整数 字符串等 组成 我希望能够检查属性是否存在 而无需手动定义属性列表 是否可以制作一条蟒蛇classiterable 本身使用标准语法 也就是说 我希望能够使用迭代所有类的属性for
  • 非法使用break语句; javascript

    当这个变量达到一定数量时 我希望循环停止 但我不断收到错误 未捕获的语法错误 非法的中断语句 function loop if isPlaying jet1 draw drawAllEnemies requestAnimFrame loop
  • PostgreSQL:使用for循环迭代表行,根据当前行检索列值

    我有以下2张表 CREATE TABLE salesperson t salespersonid numeric 4 0 NOT NULL salespersonname character varying 25 salespersonte
  • matlab中无限while嵌套在for循环中

    我想做一个while循环 嵌套在for在 Matlab 中循环以查找数据中不同对之间的距离 我的数据具有以下形式 ID lon lat time 1 33 56 40 89 803 2 32 45 41 03 803 3 35 78 39
  • 如何制作一个 bash 脚本来同时创建 40 个程序实例?

    我是新来的bash and Linux 我编写了一个程序 我想创建多个同时实例 现在 我通过打开 10 个新终端 然后运行该程序 10 次 我运行的命令是php home calculatedata php 使用 bash 脚本执行此操作的
  • Snowflake 中的动态 SQL

    当我在雪花中运行动态 SQL 时 遇到以下错误 未完成对 SQL MAIN 的分配 因为值超出了变量的大小限制 它的大小是263 限制为 256 内部存储大小以字节为单位 这是代码 SET v G 1 SET v G1 v G VARCHA
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • gfortran 支持尾调用消除吗?

    我编写了这个小程序来测试 gfortran 是否执行尾调用消除 program tailrec implicit none print tailrecsum 5 0 contains recursive function tailrecsu
  • 如何格式化整数以仅具有所需的大小?

    我一直在尝试以下代码 program hello write i9 10 end program hello 并改变格式字符串 尝试使写入输出的字符串大小恰好满足表示整数所需的大小 但到目前为止我无法管理它 如何在 Fortran 中编写
  • 循环浏览文件夹中的工作簿

    我正在尝试从文件夹中的所有工作簿复制某些单元格 下面的代码仅循环遍历第一个文件 VBA 新手 欢迎任何帮助 提前致谢 Sub Get Data Dim Directory As String Dim Filename As String D
  • 程序不等待 cin

    int x 0 string fullname float salary float payincrease float newsal float monthlysal float retroactive while x lt 3 cout
  • 如何从另一个数组值中过滤数组值并返回新数组? [复制]

    这个问题在这里已经有答案了 我有两个数组 all languages and taken languages 第一个包含所有语言 例如 200 种或其他语言 第二个包含之前选择的语言 从 0 到 200 种 我需要删除所有已采用的语言 ta

随机推荐

  • 可以使用 htaccess 隐藏图像路径吗?

    我有这样的图像路径http blablablabla com Admin img blablabla jpg但我不想向用户显示此路径 我可以隐藏此 URLhtaccess 例如 用户将看到这样的路径http blablablabla com
  • NSLocalizedString 问题

    我有 IBAction about UIAlertView alert UIAlertView alloc initWithTitle NSLocalizedString About Title of AlertView message A
  • ostringstream 和复制构造函数的问题[重复]

    这个问题在这里已经有答案了 可能的重复 为什么不允许复制字符串流 如何在 C 中从一个字符串流对象复制到另一个字符串流对象 编译类 T 失败 Visual C 和 GCC 产生 iostreams 模板错误 这是代码 include
  • cellForRowAtIndexPath 从未在 UITableViewController 中调用

    使用 UITableViewController 永远不会通过以下方式调用 cellForRowAtIndexPath numberOfRowsInSection 是 import UIKit import EventKit class E
  • Xtext Bundle org.eclipse.emf.mwe.utils 无法解析

    我正在尝试学习使用 Xtext 当我使用市场或使用安装新软件在现有 Eclipse Neon 安装中安装 Xtext 时 我无法创建 Xtext 项目 请参阅无法在 Eclipse 中创建 Xtext 项目 然后我尝试使用 Eclipse
  • 如何使用GeoJson定义圆?

    我想在 Mongodb 中使用几何 但根据 geojson 不支持圆geojson org 我遇到了完全相同的问题 解决方案是创建一个大致近似于圆的多边形 想象一个具有 32 条以上边的多边形 我写了一个执行此操作的模块 你可以这样使用它
  • 在 Java 中验证日期

    我使用的是 NetBeans IDE 7 2 我有两个单独的课程newDateTest java and newDateMethod java 我目前正在使用我的方法类来验证我在测试类中使用的用户输入的日期 到目前为止 在我的测试课中 我有
  • 在第一个和最后一个网格项目之前和之后添加空格

    我的问题与此相同问题 但给定的解决方案不起作用 这里有一个codepen我正在处理的事情 我尝试了两种不同的方法 这两种方法几乎都是正确的 但不完全正确 1 申请 before and after第一个和最后一个网格项的伪类 不幸的是当我添
  • 在 HTML Canvas 中添加字母间距

    我读过很多 StackOverflow 答案和其他页面 讨论如何在 Canvas 中设置字母间距 更有用的之一是canvas 元素中的字母间距 正如另一个问题所说 我有一个要在其中绘制文本的画布元素 我想设置类似于 CSS letter s
  • 如何使用jquery触发anchor的默认点击事件?

    假设我的页面中有一个锚点 例如 a href header turn to header a 然后我还在我的页面中设置了一个按钮
  • 气氛响应、广播不调用 javascript onMessage 处理程序

    我正在与气氛合作 试图使用在我的 Eclipse 环境中本地运行的气氛 2 0 3 tomcat 7 0 42 来获得简单的基本实现 也从外部机器连接以查看与wireshark的流量 我遇到的问题是无论我使用什么传输 websocket s
  • 如何在 PHP 文件中获取 jQuery 变量值 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 询问代码的问题必须对所解决的问题表现出最低限度的了解 包括尝试的解决方案 为什么它们不起作用以及预期结果 也可以看看 Stack Overflow 问题清单 有关您编写的代码的问题必
  • 在带有 html 和正文显示的窗口中截断的页面:隐藏

    注 基于以下答案 aavrug and kukkuz 我重新组织了我的问题 以便它充分传达我想问的内容 我有一个页面布局 其中有一个顶部导航栏和一个侧面导航栏 它还具有显示数据的主要部分 因为我只想滚动主要部分 所以我设置了html bod
  • 更新对象数组中的对象属性的最有效方法

    我想知道更新存储在包含 10k 项的数组中的对象属性的最有效方法是什么 例如 如果我有一个包含这样的对象的数组 name Price 如果数组已包含该元素 我想替换或更类似于更新价格值 检查数组是否包含名称 x 的对象 如果是 则将价格替换
  • 如何检测 Godot 中的碰撞?

    我有3个场景 一个名为 KinematicBody2D tscn 的 KinematicBody2D 节点 该场景是一个玩家在屏幕上从左向右移动 我还有一个名为 mob tscn 的场景 它是一个igidbody2d节点 这个场景只有精灵和
  • 使用 Javascript 从父窗口访问子窗口元素

    我需要从父窗口访问子窗口元素 我在下面编写了示例片段 父级 HTML
  • 如何获取任何应用程序上下文根的文件系统路径

    我正在开发 Web 应用程序 我在我的 jsp 上调用request getContextPath 但奇怪的是我得到了地址 streetshop 然后我附加一些路径作为request getContextPath abc 并创建文件夹 然后
  • Spring 加密属性文件中的值

    我目前正在使用UserDetailsService从用户文件中获取值
  • Kinetic js 中的可编辑文本选项

    我想添加Textbox或可编辑元素 为用户提供编辑文本的选项 这是我当前的代码 var text new Kinetic Text text Sample Text gt i want to edit this text x 50 y 10
  • OPENMP F90/95 嵌套 DO 循环 - 串行实现的问题得到改进

    我已经进行了一些搜索 但找不到任何与我的问题相关的内容 很抱歉 如果我的问题是多余的 无论如何 正如标题所述 我在代码的串行实现方面无法获得任何改进 我需要并行化的代码片段如下 这是带有 OpenMP 的 Fortran90 do n 1