- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编译器: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
或 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,所以我对这个程序正确性的信心不如我可以将所有结果写入 stdout 那样高。
关于fortran - 16 字节实数的 MPI_AllReduce 的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33109040/
我现在脑子里有这个迫切的问题:在现代 Fortran 中声明 double 实数的“可接受”方式是什么?从最旧到最新,故事似乎是这样的:DOUBLE PRECISION ,然后 REAL(kind=8
我编写了一个程序,允许将中缀表达式转换为后缀表达式,但它仅适用于一位数字[A-Z][a-z][0-9]。我怎样才能使实数(正数和负数)成为可能? Example: (50 + 3.75) + 50 -
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
使用 z3/python Web 界面,如果我问: x = Real ('x') solve(x * x == 2, show=True) 我很好地理解: Problem: [x·x = 2] Sol
我写了一个正则表达式来匹配任何数字: 正面和负面 十进制 实数 下面的正则表达式很好,但有一个缺点 ([\+\-]{1}){0,1}?[\d]*(\.{1})?[\\d]* 对于 + 或 - 等输入也
为什么当我在 SQL Server 中将 40.54 的值保存到 Real 类型的列时,它返回给我的值更像是 40.53999878999 而不是 40.54?我已经见过几次这种情况,但一直不明白为什
很震惊地学习这个,我肯定在犯错误...... 如果我 DECLARE 一个实数(或十进制)局部变量,我不能分配 (SET) 表达式的值?我必须先设置一个值,然后逐步执行表达式。如果我尝试一次“计算”所
我正在用 Python 为 Fortran 库编写前端。 Python 模块应该可以在 32 位和 64 位机器上运行;适用于 Windows、Linux 和 Mac。 我想了解一些数据类型的字节宽度
在 C++ 中,想要对较长的 (2^20) 实数 vector 进行排序,显然 sort() 可以解决问题。在我习惯了漂亮的 order() 函数之前使用过 R,该函数产生导致排序 vector 的排
给定一个真实值,我们能否检查 float 数据类型是否足以存储数字,或者是否需要 double? 我知道精度因架构而异。是否有任何 C/C++ 函数可以确定正确的数据类型? 最佳答案 有关背景,请参阅
我有一个 data.table , DT其中包含一列 C具有满足不等式的实值条目 0 (i-1)/N & x (i - 1)/10 & x (i - 1)/10 & x (i - 1)/10 &
需要帮助:如何使用 Excel 公式或 VBA 获取字符串中的十进制(实数)数字?我在“A 列”中有一个字符串,上面只有一个十进制数。我只想提取十进制(实数)数字,但它正在提取字符串上的第一个数字。详
我有一个维度为 (Nx, Ny, Nz) 的 3D 数组。 我想使用 FFTW3 库沿 z 轴应用真正的 FFT 和 IFFT。 这里,'z' 是变化最快的索引。 我已经使用 python 编写了相同
目前,我正在考虑拍摄图像及其光谱。现在 Parceval 的定理说两者应该具有相等的能量。然而,当我尝试在某些图像上对此进行测试时,numpy 真实 FFT 函数似乎并非如此。 这是我用于测试的代码:
用于将数值/实数/ double 转换为字符变化/文本。 select (12.0/100)::Double Precision;# 0.12 select (12.0/100)::Double Pr
我正在验证一个函数来计算我实验室中某个标准的通过率。这背后的数学原理非常简单:给定一些通过或失败的测试,通过的百分比是多少。 数据将作为一列值提供,即 P1 (第一次测试通过),F1 (第一次测试失败
我是一名优秀的程序员,十分优秀!