16 字节实数的 MPI_AllReduce 的奇怪结果

2024-01-09

编译器:gfortran-4.8.5

MPI 库:OpenMPI-1.7.2(预装 OpenSuSE 13.2)

这个程序:

  use mpi
  implicit none

  real*16 :: x
  integer :: ierr, irank, type16

  call MPI_Init(ierr)

  call MPI_Comm_Rank(MPI_Comm_World, irank, ierr)

  if (irank+1==1) x = 2.1
  if (irank+1==8) x = 2.8
  if (irank+1==7) x = 5.2
  if (irank+1==4) x = 6.7
  if (irank+1==6) x = 6.5
  if (irank+1==3) x = 5.7
  if (irank+1==2) x = 4.0
  if (irank+1==5) x = 6.8

  print '(a,i0,a,f3.1)', "rank+1: ",irank+1," x: ",x

  call MPI_AllReduce(MPI_IN_PLACE, x, 1, MPI_REAL16, MPI_MAX, MPI_Comm_World, ierr)

  if (irank==0) print '(i0,a,f3.1)', irank+1," max x: ", x

  call MPI_Finalize(ierr)
end

我也尝试过real(16), real(kind(1.q0)). real(real128)实际上相当于real*10对于这个编译器。

结果是:

> mpif90 reduce16.f90 
> mpirun -n 8 ./a.out 
rank+1: 1 x: 2.1
rank+1: 2 x: 4.0
rank+1: 3 x: 5.7
rank+1: 4 x: 6.7
rank+1: 5 x: 6.8
rank+1: 6 x: 6.5
rank+1: 7 x: 5.2
rank+1: 8 x: 2.8
1 max x: 2.8

该程序找到了真正的最大值real*10保持MPI_REAL16。 MPI 规范(3.1,第 628 和 674 页)不是很清楚,如果MPI_REAL16对应于real*16 or real(real128)如果这些不同。

另外,假设MPI_REAL16实际上是real(real128)尝试在程序中使用它会导致不同的问题:

Error: There is no specific subroutine for the generic 'mpi_recv' at (1)
Error: There is no specific subroutine for the generic 'mpi_send' at (1)

这不会发生在real*16。 (忽略应该能够通过任何位模式,所以这个检查是多余的)

使用 16 字节实数的正确方法是什么? OpenMPI 库是否有错误?


虽然这应该在每个 MPI 实现中都能正常工作,但一个简单的解决方法是为这种类型实现用 Fortran 编写的用户定义的归约,因此在 C 中实现它没有问题(这就是 MPICH 和 OpenMPI 尝试的方式)做所有事情,因此当 C 无法重现 Fortran 的行为时会出现问题)。

下面是实现这一点的尝试。这是 Fortran 中用户定义的缩减。我确信经验丰富的现代 Fortran 程序员可以做得更好。

  subroutine sum_real16(iv,iov,n)
    implicit none
    integer, intent(in) ::  n
    real*16, intent(in) :: iv(:)
    real*16, intent(inout) :: iov(:)
    integer :: i
    do i = 1,n
      iov(i) = iov(i) + iv(i)
    enddo
  end subroutine sum_real16
  subroutine reduce_sum_real16(iv, iov, n, dt)
    use, intrinsic ::  iso_c_binding, only : c_ptr
    use mpi_f08
    implicit none
    type(c_ptr), value ::  iv, iov
    integer ::  n
    type(MPI_Datatype) ::  dt
    if ( dt .eq. MPI_REAL16 ) then
        call sum_real16(iv,iov,n)
    endif
  end subroutine reduce_sum_real16
  program test_reduce_sum_real16
    use, intrinsic ::  iso_c_binding
    use mpi_f08
    implicit none
    integer, parameter ::  n = 10
    real*16 :: output(n)
    real*16 :: input(n)
    real*16 :: error
    integer :: me, np
    procedure(MPI_User_function) :: reduce_sum_real16
    type(MPI_Op) :: mysum
    integer :: i
    call MPI_Init()
    call MPI_Comm_rank(MPI_COMM_WORLD,me)
    call MPI_Comm_size(MPI_COMM_WORLD,np)
    output = 0.0
    input  = 1.0*me
    call MPI_Op_create(reduce_sum_real16,.true.,mysum)
    call MPI_Allreduce(input,output,n,MPI_REAL16,mysum,MPI_COMM_WORLD)
    error = 0.0
    do i = 1,n
      error = error + (output(i)-1.0*np)
    enddo
    if (error.gt.0.0) then
        print*,'SAD PANDA = ',error
        call MPI_Abort(MPI_COMM_SELF,1)
    endif
    call MPI_Op_free(mysum)
    call MPI_Finalize()
  end program test_reduce_sum_real16

该程序使用 Intel 16 Fortran 编译器和 MPICH 3.2+ 正常返回。显然我没有正确使用 I/O,所以我对这个程序正确性的信心并不像我可以将所有结果写入标准输出那样高。

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

16 字节实数的 MPI_AllReduce 的奇怪结果 的相关文章

  • Fortran 小数和千位分隔符

    有没有办法更改逗号的句点小数分隔符 另外 如何使输出数字具有千位分隔符 这可以是逗号 句号 空格 打开文件时使用参数 DECIMAL COMMA open 100 file logfile status unknown DECIMAL CO
  • 从接口访问参数 (Fortran)

    我正在使用参数来修复所用类型的精度 在我尝试在接口中使用相同类型之前 这种方法工作得很好 考虑这个小例子 module Hello implicit none save integer parameter K selected real k
  • #pragma 末尾的隐式屏障

    朋友们 我正在尝试学习 openMP 范例 我使用以下代码来理解 omp for pragma int main void int tid int i omp set num threads 5 pragma omp parallel pr
  • 使用 MPJ Express 发送对象

    我是并行编程的新手 我想用 java 来完成它 我想知道是否可以通过 MPI 发送和接收更复杂的对象 我用的是 MPJ Express 然而 每当我想发送一个对象时 我都会收到 ClassCastException MPI Init arg
  • 使用 MPI 派生数据类型

    我正在学习 Fortran 中的 BCASTing 数据类型 并且有一个代码可以从终端获取两个值并将它们显示在每个进程上 对于整数 整数和整数 实数类型的组合 value1 value2 这是有效的 但是对于整数 实数 8 的组合 它会失败
  • 在 fortran 中生成序列数组

    Fortran中是否有一个内在函数可以生成一个包含从a到b的数字序列的数组 类似于python的range gt gt gt range 1 5 1 2 3 4 gt gt gt range 6 10 6 7 8 9 不 没有 但是 您可以
  • 使用 Iso_Fortran_Env 设置函数的 Kind 值

    如何使用 ISO Fortran Env 的内在函数以 Fortran 2008 惯用的方式设置函数的返回 KIND 值 通常在主程序中 我可以使用 ISO Fortran 内在函数 如下所示 program name here use i
  • 用MPI发送size_t类型数据

    在 MPI 中发送 size t 类型数字的最安全方法是什么 例如 我确信它是not将其作为 MPI INT 盲目发送是安全的 MPI LONG 总是有效吗 使用宏怎么样 include
  • 如何通过 mpi c++ 发送布尔数据类型?

    我是 C 新手 尝试通过 MPI 发送 bool 数据类型 但 C 不支持此数据类型 我试着做到了MPI BYTE and MPI INT但它什么也没打印 include
  • 在 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
  • MPI_Type_create_subarray 和 MPI_Gather

    我必须解决一些 mpi 问题 我有 4 个从进程 每个进程都想发送一个 2d 子数组 CHUNK ROWS X CHUNK COLUMNS 到 master 0 Master 0 收集 ddd ROWS COLUMNS 中的所有块并打印它
  • scanf 的四边形和参数类型

    我用
  • Dependency Walker 未显示所有依赖的 Dll

    我有一个 fortran dll 我想知道它所依赖的程序集再分配目的 http software intel com en us forums showthread php t 73161 我发现的一件事是依赖项步行器没有显示所有依赖项 即
  • MPI+CUDA 与纯 MPI 相比有何优势?

    加速应用程序的常用方法是使用 MPI 或更高级别的库 例如在幕后使用 MPI 的 PETSc 并行化应用程序 然而 现在每个人似乎都对使用 CUDA 来并行化他们的应用程序或使用 MPI 和 CUDA 的混合来解决更雄心勃勃 更大的问题感兴
  • Fortran 函数:指针作为实际参数,目标作为形式

    我正在尝试破译 Fortran 代码 它将指向函数的指针作为实际参数传递 而形式参数则是目标 它在主程序中定义并分配一个 globalDATA 类型的指针 然后调用一个传递该指针的函数 module dataGLOBAL type glob
  • 如何包装 fortran write 语句

    我想包装 fortran写语句 http software intel com sites products documentation doclib stdxe 2013 composerxe compiler fortran lin 在
  • 如何调用模块中子程序内部的函数?

    我有一个包含子例程的模块 该子例程又包含一个函数 我说use themodule在我的主程序中 我可以call thesubroutine 但是如何访问子例程中包含的函数呢 代码如下所示 module useful integer para
  • 最佳 Fortran IDE [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 stackoverflow上有人用Fortran吗 您使用什么 IDE 您认为哪一个是最好的 似乎我周围的很多人都对 Intel Visu
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点?

    我有一个 R 包 它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环 很大程度上依赖于 BLAS 和 LAPACK 例程 作为 Fortran 的接口 我使用 Fortran功能 我刚刚读过乔纳森卡拉汉的博客文章 http

随机推荐

  • MySQL FIND_IN_SET 与数组字符串

    我正在查询的表中有一个字段与此类似 Name Phone Category IDS Category Labels Sample 1111111111 1 foo bar 我尝试使用 FIND IN SET 函数查找包含逗号分隔列表中列出的
  • 在SQL Reporting Services中,如何根据参数过滤数据集?

    我有一个未经过滤的数据集需要处理以生成报告 顺便说一句 SQL Server 2005 假设我有一个Name列 我想向我的报告添加一个参数 以便仅选择包含某些字符的名称 有人知道如何处理这些过滤器吗 我尝试过这些但没有运气 Fields N
  • 如何从生产版本中删除 data-testid

    我想从生产版本中删除 data testid 因此在产品版本中找不到这些属性 特别是在这种情况下 我需要一些可以处理 tsx 文件的东西 我知道如何使用组件中的函数删除它 但我认为应该有一种更聪明的方法来做到这一点 反应 cra 反应应用程
  • 在错误的手动合并冲突解决之后重新冲突合并

    解决合并冲突并提交后 很明显我的手动合并冲突解决方法是错误的 我已经上演 提交并推送了该存储库 如何使冲突文件恢复到冲突状态 以便我可以以不同的方式解决它 请注意 此时为时已晚git checkout m因为我已经提交了错误的合并解决方案
  • 如何在 Amazon Cognito 中禁用某些用户的验证?

    如果激活了验证功能 Amazon Cognito 会自动发送验证码 在我的项目中 有时 我会添加用户 AWS Java SDK中的Signup函数 并自己通过AdminConfirmSignup验证他们 所以我不希望他们收到验证邮件 我将手
  • 如何使用 php 将 php 文件读取为字符串?

    假设我想使用 php 脚本将当前页面的代码读入字符串中 而不执行页面的 php 内容 我该如何做到这一点 例如使用 file get contents test php 将获取 test php 的内容 但它会执行代码 我怎样才能获取文件的
  • Android 数据绑定库与 Kotlin Android 扩展

    我正在阅读有关 MVVM 架构如何工作以及如何使用 Android 数据绑定库帮助的内容 一般来说 我理解 Android 数据绑定在 UI 层和保存要显示的信息的底层数据模型之间创建了一个链接 Kotlin Android 扩展是另一个
  • CMake“NMake Makefiles”生成器无法编译

    我正在根据本教程编译简单的应用程序 https www johnlamp net cmake tutorial 1 getting started html https www johnlamp net cmake tutorial 1 g
  • 类和数据类型有什么区别?

    我听到过这样的说法 我们可以说类是一种数据类型 或者数据类型是类的一种类型 谁能向我解释一下这到底是什么意思 C 是一种强类型语言 因此每个变量和对象 必须有一个声明的类型 数据类型可以描述为 内置数据类型 例如 int 或字符 或 用户定
  • 无法使用 ldap 凭据登录 wso2 身份服务器

    我试图将 wso2 身份服务器连接到 Ldap ReadWriteLDAPUserStoreManager 集成成功并且可以从 wso2 身份服务器访问 ldap 用户 但问题是我无法使用 ldap 用户名和密码登录身份服务器 请帮我 Pl
  • C++:多态类模板

    考虑一个存储一堆 Date 对象的 Calendar 类 日历旨在保存从 Date 继承的任何类型的对象的集合 我认为最好的方法是有一个类模板 例如 template
  • 如何创建可在多个 React 项目中使用的私有共享组件库

    以下场景 项目1需要使用CustomButton jsx 项目2需要使用CustomButton jsx 目前的解决方案 复制粘贴CustomButton jsx进入项目 1 和 2 所需的解决方案 创建项目 3 其中包括CustomBut
  • iOS 8 共享扩展无法在设备上运行

    我在 xcode 中创建了一个新的目标共享扩展 然后我在我的设备上运行它 我不知道为什么当我在我的设备 iPhone 5c iPhone 5s iPhone 6 上运行共享扩展时 不会显示 请帮助我 任何有关如何解决此问题的建议将不胜感激
  • 将 Keras 预训练模型扩展到具有附加通道或波段的图像

    我只是希望澄清之前一篇文章的一些信息 该文章讨论了如何将 Keras 预训练模型 如 VGG 或 InceptionV3 扩展到不同大小的图像 我的问题是我有一些 8 波段的卫星图像 所以图像可能是650x650x8而不是通常的 RBG 3
  • 如何在XMPP(Openfire)中删除群聊消息?

    我想从 openfire 历史记录中删除单个群聊消息 是否可以 历史记录不保存在 OfMessageArchive 表中 删除应用程序中的消息后 该消息消失 但重新登录后从 Openfire 的 基础 下载 它仍然可见 到目前为止 您还无法
  • QtabBar 文本和图标

    您好 我想在 QtabBar 小部件中选项卡栏的每个选项卡中的图标下方放置图标和文本 默认情况下 文本和图标设置为彼此相邻 我想将一个显示在另一个下方 我们怎样才能做到呢 似乎只有一种方法可以更改图标位置 重新实现 QTabBar 的pai
  • 按下时如何将数据从第二个活动传递到第一个活动? - 安卓

    我有2个活动 活动1 and 活动2 In Activity1 I ve a Button and TextView 当按钮被点击时活动2已开始 In Activity2我有一个EditText 我想显示检索到的数据EditText in
  • 如何使用 aws lambda 将文件写入 s3 (python)?

    我尝试使用 lambda 函数将文件写入 S3 然后测试显示 成功 但我的 S3 存储桶中没有出现任何内容 发生了什么 有人可以给我一些建议或解决方案吗 多谢 这是我的代码 import json import boto3 def lamb
  • 获取轴上 numpy.argmax 元素的索引

    我有 N 维矩阵 其中包含具有 N 个参数的函数的值 每个参数都有离散数量的值 我需要在除一个参数之外的所有参数上最大化该函数 从而产生一个大小等于非最大化参数值的数量的一维向量 我还需要保存其他参数采用的值 为此 我想迭代应用numpy
  • 16 字节实数的 MPI_AllReduce 的奇怪结果

    编译器 gfortran 4 8 5 MPI 库 OpenMPI 1 7 2 预装 OpenSuSE 13 2 这个程序 use mpi implicit none real 16 x integer ierr irank type16 c