fortran - MPI_finalize 是否释放内存?
问题描述
在下面的代码中,我有一个在 MPI 中使用的数组b 。据我了解,每个处理器甚至在调用MPI_INIT
. 但是我们调用之后会发生什么MPI_FINALIZE
?每个处理器仍然可以使用那块内存吗?
以类似的方式,如果b被声明为指针,它被分配在内部MPI_INIT
-MPI_FINALIZE
但它没有被释放,会发生什么?最终确定 MPI 后,该内存是否仍然可用?
program main
use mpi
implicit none
integer myr, numpr, ier
integer b(1000)
call MPI_INIT(ier)
call MPI_COMM_RANK(MPI_COMM_WORLD, myr, ier)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numpr, ier)
if (myr .eq. 0) then
!initialize b array
endif
call MPI_BCAST(b, 100, MPI_INTEGER, 0, MPI_COMM_WORLD, ier)
call MPI_FINALIZE(ier)
!do more calculations with b
end
解决方案
如果您想象您编写的代码没有任何 MPI 内容,您会看到每个处理器都以大小为 1000 的 B 数组开头,因为您将其声明为:
integer b(1000)
MPI_Init 和 MPI_Finalise 都不参与分配或解除分配任何此内存。
同样,您可以在运行时 (C) 分配一个数组,它会一直存在,直到您显式取消分配它:
PROGRAM main
use mpi
implicit none
integer myr, numpr, ier
integer b(1000)
INTEGER, ALLOCATABLE :: C(:)
call MPI_INIT(ier)
call MPI_COMM_RANK(MPI_COMM_WORLD, myr, ier)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numpr, ier)
ALLOCATE(C(1000))
if (myr .eq. 0) then
b = 100 ! Set all values to 100
c = 99 ! Ditto 99
endif
call MPI_BCAST(b, 1000, MPI_INTEGER, 0, MPI_COMM_WORLD, ier)
call MPI_BCAST(c, 1000, MPI_INTEGER, 0, MPI_COMM_WORLD, ier)
call MPI_FINALIZE(ier)
PRINT *, myr, B(200)
PRINT *, myr, C(200)
DEALLOCATE(C)
END PROGRAM main
产生输出:
1 100
1 99
0 100
0 99
另外,请注意您的初始代码中有一个错字(我认为)。您只发送 B 的前 100 个成员(大小为 1000)。
推荐阅读
- java - 如何使用 Joda-Time 计算两个日期之间的年数、月数和天数
- php - 使用 laravel 下载和删除文件时弹出不来
- php - Windows 中是否存在根文件系统,尤其是在 Windows 10 中?
- ios - 在飞行模式下,CTCarrier 中的 isoCountryCode 不返回 nil
- sql - 无法连接到 AWS 中的 SQL 数据库(无法访问服务器)
- java - OpenCV VideoCapture 从视频中删除 alpha 通道
- javascript - 如何使用谷歌应用脚本获取谷歌表格中特定列的最后一个单元格?
- node.js - NodeJS - 从 java 密钥库文件中导出私钥
- android - Android 8.1.0 未选择最佳匹配图标大小
- pdf - 将 HTML 转换为 PDF Puppeteer