MSMPI 就地 MPI_Allreduce 不适用于 MinGW-w64 gfortran

2023-12-30

我正在尝试使用就地MPI_Allreduce结合MinGW-w64 gfortran(MSYS64提供的版本9.2)和Microsoft MPI(版本10),

call MPI_Allreduce(MPI_IN_PLACE, srcdst, n, MPI_REAL8, MPI_SUM, MPI_COMM_WORLD, ierr)

标准MPI_Allreduce(具有不同的源和目标)效果很好,当我使用 C 而不是 Fortran 时,就地变体也是如此。

完整的测试程序test_allreduce.f90 is

program test_allreduce

    use iso_fortran_env, only: real64
    use mpi

    implicit none

    integer, parameter :: mpiint = kind(MPI_COMM_WORLD)

    integer(mpiint) :: n = 10
    integer(mpiint) :: ierr1 = -1, ierr2 = -1, ierr3 = -1, ierr4 = -1

    real(real64) :: src(10) = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /)
    real(real64) :: dst(10) = 0

    call MPI_Init(ierr1)
    call MPI_Allreduce(src, dst, n, MPI_REAL8, MPI_SUM, MPI_COMM_WORLD, ierr2)
    call MPI_Allreduce(MPI_IN_PLACE, src, n, MPI_REAL8, MPI_SUM, MPI_COMM_WORLD, ierr3)
    call MPI_Finalize(ierr4)

    write (*, '(I4)') MPI_IN_PLACE
    write (*, '(4I4)') ierr1, ierr2, ierr3, ierr4
    write (*, '(10F4.0)') src
    write (*, '(10F4.0)') dst

end program

这就是我编译它的方式:

set "PATH=C:\msys64\mingw64\bin;%PATH%"

x86_64-w64-mingw32-gfortran ^
    -fno-range-check ^
    "C:\Program Files (x86)\Microsoft SDKs\MPI\Include\mpi.f90" ^
    test_allreduce.f90 ^
    -I . ^
    -I "C:\Program Files (x86)\Microsoft SDKs\MPI\Include\x64" ^
    -o test_allreduce.exe ^
    C:\Windows\System32\msmpi.dll

这就是我执行它的方式(到目前为止仅在单个进程中):

test_allreduce.exe

目前,它打印

   0
0   0   0   0
0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
1.  2.  3.  4.  5.  6.  7.  8.  9. 10.

显然,src缓冲区在第二次(就地)调用中被垃圾覆盖MPI_Allreduce.

我在代码中看到mpi.f90Intel 特定的 DLLIMPORT 指令,甚至尝试添加类比

!GCC$ ATTRIBUTES DLLIMPORT :: MPI_IN_PLACE

没有任何影响。


事实证明,问题在于 MSMPI 中的变量MPI_IN_PLACE包含在一个内部COMMON block /MPIPRIV1/这是一个在 gfortran 中,编译器无法正确导入COMMON来自 DLL 的块变量。

然而,坏了的东西是可以修复的,最后所需要的只是应用一个patch https://stackoverflow.com/a/58123046/2249356到 gfortran 代码并在 MSYS2 中从头开始编译它(phew...), and添加指令

!GCC$ ATTRIBUTES DLLIMPORT ::  MPI_BOTTOM, MPI_IN_PLACE

就在之后implicit none在上面提供的代码中。 (指令中似乎需要这两个变量,因为MPI_IN_PLACE内部排名第二COMMON紧接着阻塞MPI_BOTTOM.)然后就地MPI_Allreduce工作完美。

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

MSMPI 就地 MPI_Allreduce 不适用于 MinGW-w64 gfortran 的相关文章

  • 使用 Iso_Fortran_Env 设置函数的 Kind 值

    如何使用 ISO Fortran Env 的内在函数以 Fortran 2008 惯用的方式设置函数的返回 KIND 值 通常在主程序中 我可以使用 ISO Fortran 内在函数 如下所示 program name here use i
  • libtool:i686-pc-mingw32 共享中不允许未定义的符号

    我正在使用自动工具作为我的库的构建系统 最近库被移植到Windows 尽管我遇到了一个奇怪的错误 但库编译和链接成功 配置和make后只有静态库 除了警告之外 一切看起来都很好libtool libtool undefined symbol
  • fortran 77 到 fortran 90 的转换器软件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有 fortran 77 编码 但我想转换为 fortran 90 在哪里可以下载转换器软件 这是我帮
  • 大多数编译器都会优化 MATMUL(TRANSPOSE(A),B) 吗?

    In a Fortran program I need to compute several expressions like M v MT v MT M M MT etc Here M and v are 2D and 1D arrays
  • 如何通过 mpi c++ 发送布尔数据类型?

    我是 C 新手 尝试通过 MPI 发送 bool 数据类型 但 C 不支持此数据类型 我试着做到了MPI BYTE and MPI INT但它什么也没打印 include
  • C++/Fortran 中贝塞尔函数的集成 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在 Fortran 或 和 C 中对包含贝塞尔函数的方程进行从 0 到 无穷大 的数值积分 我在matlab中做了 但对于较大的输入和特
  • 忽略 doxygen 注释块中的行

    是否可以在 doxygen 注释块中包含将被 doxygen 忽略的内容 换句话说 我们可以在 doxygen 评论块中发表评论吗 背景 我们正在将 Fortran 项目的代码内注释转换为 doxygen 可解析的格式 但是该项目要求代码内
  • 在 Fortran 中确定循环后循环控制变量的值

    我有以下程序 program example implicit none integer i x1 real x 10 0 do i 10 1 2 x 10 i 2 i 1 enddo x1 i 2 1 end program exampl
  • Fortran 中指数函数的 DEXP 或 EXP?

    我有两个非常简短的问题 1 我刚刚读到DEXP is the archaic的形式EXP 这是否意味着不应再使用它 我一直以为DEXP 双精度等于EXP 2 指数函数的范围是多少 它依赖于编译器吗 问题 1 在现代 Fortran 中 最好
  • OpenMP 因大型数组而崩溃

    我正在使用 Fortran 和 OpenMP 但当我尝试在存在大型数组时使用 OpenMP 并行化循环时 我不断遇到问题 例如 以下代码 PROGRAM main IMPLICIT NONE INTEGER PARAMETER NUMLOO
  • MPI+CUDA 与纯 MPI 相比有何优势?

    加速应用程序的常用方法是使用 MPI 或更高级别的库 例如在幕后使用 MPI 的 PETSc 并行化应用程序 然而 现在每个人似乎都对使用 CUDA 来并行化他们的应用程序或使用 MPI 和 CUDA 的混合来解决更雄心勃勃 更大的问题感兴
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应
  • Fortran 函数:指针作为实际参数,目标作为形式

    我正在尝试破译 Fortran 代码 它将指向函数的指针作为实际参数传递 而形式参数则是目标 它在主程序中定义并分配一个 globalDATA 类型的指针 然后调用一个传递该指针的函数 module dataGLOBAL type glob
  • Fortran PURE 函数可以使用全局参数吗?

    在我看来 Fortran 中所谓的纯函数对于那些使用函数式编程的人来说似乎不够纯粹 这是我的问题 假设我有以下代码 MODULE basics IMPLICIT NONE INTEGER PARAMETER dp kind 1 0d0 RE
  • 垂直和水平平行度

    最近在并行领域工作 我了解到有两个术语 垂直并行 和 水平并行 有人说openmp 共享内存并行 是垂直并行 而mpi 分布式内存并行 是水平并行 为什么这些术语这么称呼 我不明白原因 这么称呼它们只是术语吗 这些术语似乎没有被广泛使用 也
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • 最佳 Fortran IDE [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 stackoverflow上有人用Fortran吗 您使用什么 IDE 您认为哪一个是最好的 似乎我周围的很多人都对 Intel Visu
  • MPI_Comm_Create 挂起而无响应

    我希望多播到不超过 4 台机器的组 MPI bcast 是否仍然比多个单播节省大量时间 请记住我的组规模很小 我编写了以下函数来根据机器的数量和这些机器的等级创建一个新的通信器 void createCommunicator MPI Com
  • 将数组从 .npy 文件读入 Fortran 90

    我使用 Python 以二维数组 例如 X 的形式生成一些初始数据 然后使用 Fortran 对它们进行一些计算 最初 当数组大小约为 10 000 x 10 000 时 np savetxt 在速度方面表现良好 但是一旦我开始增加数组的维
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时

随机推荐

  • 在方向改变时保存活动状态(不仅仅是一些变量)

    我意识到关于这个话题已经有很多问题了 但我连基本的知识都不懂保存活动的状态 请参阅下面的屏幕截图 当应用程序启动时 1 ScrollView 项目 1 2 3 4 可见 2 表包含通过增益按钮填充的数据 如下图所示 当应用程序在肖像模式下运
  • 在 Swift 中使用 GLKit 中的 GLKMath

    因此 我正在使用 Ray Wenderlich 编写的一本名为 iOS Games 的书 并尝试利用其中找到的一些 Objective C 代码来使我的游戏中的角色的加速计控制正常工作 不过 我想使用 Swift 而不是 Objective
  • 静态链接使用 C++ 包装器库的 haskell 程序

    我正在尝试制作一个程序 通过一些第三方模块 依赖于icu http www icu project org图书馆 我怀疑依赖是通过Network HTTP Conduit但也许是通过别的东西 即使在同一发行版的相邻版本之间 动态链接的二进制
  • 这段代码有什么问题,它给出了错误

    谁能告诉我这段代码有什么问题 它返回语法错误的错误 任何人都可以修复它吗 dos writeBytes twoHyphens boundary lineEnd dos writeBytes Content Disposition form
  • c++ string to boost::multi precision::cpp_int

    如何将字符串转换为 boost multi precision cpp int 此外 我有一个 txt 文件 其中包含 100 个数字 每个数字 50 位 我使用 ifstream 将它们逐行读取到字符串数组中 如何将数组中的每个字符串转换
  • 对于每个方法都返回“this”的构建器模式是否有特定术语?

    我知道这是构建器模式 但它是它的修改形式 而维基百科关于构建器模式的文章给出了示例 pizzaBuilder createNewPizzaProduct pizzaBuilder buildDough pizzaBuilder buildS
  • 如何在同一端口但不同路径上同时使用socketio和ws

    我使用socketio作为我的websocket库启动了一个应用程序 但现在我需要使用不支持socketio的sharejs 我本想改变这个库 但我在socketio方面已经取得了很大的进步 我尝试使用 websocket ws 库 它似乎
  • GPU并行编程C/C++ [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想学习 C C 中的 GPU 并行编程 我应该使用什么库和编译器 如果它们是开源的 那就太好了 注意
  • Elasticsearch 中位数组的使用和过滤

    我有一个位数组 我想根据某些位是打开还是关闭进行过滤 查看 Elasticsearch 2 3 文档 我没有看到任何有关位数组的内容 但似乎我可以使用布尔数组或二进制字段 例子 假设我有 2 个文档 每个文档都有一个位数组字段 该字段中 D
  • 主线程会在子线程完成执行之前退出吗? [复制]

    这个问题在这里已经有答案了 主线程会在子线程完成执行之前退出吗 我读了两篇文章 http www cs mtu edu shene NSF 3 e Book FUNDAMENTALS thread management html http
  • 损坏的 Youtube 缩略图不会触发错误回调

    如果图像为 404 但主机仍返回图像 是否会触发图像错误回调 我试图在将 URL 提交到服务器之前在客户端确定 Youtube 缩略图是否有效 通常 您可以生成缩略图 URL 而无需使用以下格式查询其 APIhttp img youtube
  • Cocoa、FSEvents、kFSEventStreamCreateFlagFileEvents 标志和“重命名”事件

    我一直在玩FSEvents在我的一个小应用程序中 将我的应用程序的内容与硬盘驱动器上的内容同步 基本上 它是一个小图像查看器 我希望它的内容在硬盘驱动器内容更改时更新 我使用创建我的流kFSEventStreamCreateFlagFile
  • Pythonic 方式比较两个列表并打印出差异

    我有两个保证长度相同的列表 我想比较列表中的相应值 第一项除外 并打印出不匹配的值 我这样做的方式是这样的 i len list1 if i 1 print Nothing to compare else for i in range i
  • HomePresenter 的未初始化常量

    我正在尝试实现一个 HomePresenter 在我的 Pages 控制器的 home 操作中使用 app controllers pages controller rb class PagesController lt Applicati
  • 将数据帧转换为特定格式的频率表

    我有一个 data frame 我正在尝试创建一个频率表来显示每行值的频率 所以我从这样的事情开始 d lt data frame a c 1 2 3 b c 3 4 5 c c 1 2 5 看起来像这样 a b c 1 3 1 2 4 2
  • ViewGroup.resetResolvedTextDirection 中的 Android StackOverflowError

    我刚刚去 android 市场发布我的应用程序的更新 并注意到现有安装报告了一些新错误 虽然我可以理解 并尝试做一些事情 其中的大多数 但这个让我相当困惑 java lang StackOverflowError at android vi
  • 将单词添加到用户词典中并从词典中检索它们

    我的应用程序中几乎没有编辑文本 用户可以在其中输入公司名称 客户名称 目的 诸如此类的内容 现在我想以编程方式将这些单词添加到字典中 因此他们不必每次都重新输入整个单词 相反 字典应该在他们开始输入时建议单词 我在网上搜索了同样的内容 得到
  • pyinstaller 2.0 - 如何为 Windows exe 文件添加描述?

    如何向单个文件 exe 添加版本 版权 文件描述等描述 python pyinstaller py F w i favicon ico C Projekte Eclipse MyApp app pyw version file 版本信息 t
  • 如何忽略 Jacoco 的 lombok.@UtilityClass?

    我用过lombok UtilityClass to 生成私有构造函数 使班级最终 将实用程序类中的所有字段设为静态 并且 Jacoco 不涵盖 Lombok 生成的代码 如果我显式定义一个私有构造函数 Jacoco 可以识别它 因此 有任何
  • MSMPI 就地 MPI_Allreduce 不适用于 MinGW-w64 gfortran

    我正在尝试使用就地MPI Allreduce结合MinGW w64 gfortran MSYS64提供的版本9 2 和Microsoft MPI 版本10 call MPI Allreduce MPI IN PLACE srcdst n M