Fortran/并行处理
外观
< Fortran
并行性包含在 Fortran 2008 标准中。要使用并行功能,Fortran 程序必须在启用并行的情况下进行编译。例如,英特尔 ifort 编译器使用标志-coarray
。
Fortran 使用分隔全局地址空间 (PGAS) 模型进行并行处理。对于每个处理器,程序都作为程序的单独重复“映像”执行,每个映像都有其自己的独立内存分区。考虑以下程序
program hello
implicit none
write (*,*) 'Hello from ', this_image(), 'of', num_images()
end program hello
内在函数this_image
返回正在执行的映像编号,内在函数num_images
返回程序的总映像数。如果程序在 4 个处理器上编译和执行,输出可能如下所示
Hello from image 1 of 4 Hello from image 4 of 4 Hello from image 2 of 4 Hello from image 3 of 4
请注意,映像是异步执行的,因此输出可能不会按 1、2、3 然后 4 的顺序显示。
协数组是在图像之间传递数组数据的途径。协数组与普通数组一样,只是它为每个图像添加了额外的协维度。协维度可以使用方括号[]
声明和索引。例如,要声明一个大小为 10 且协维度大小为 4 的秩为 1 的协数组
real :: coarr(10)[4]
! Or you can use declaration attributes to do the same thing
real, dimension (10), codimension [4] :: another_coarr
标量变量也可以是协数组
integer :: scalar[*]
这里,* 表示可用的最大处理器数。协维度可以像普通维度一样具有多个轴,但是,协维度的秩限制为 15。在图像之间传递数据就像在协维度上索引一样简单。
! Set all images to 1
coarr = 1
! Indexing
another_coarr(3)[4] = coarr(3)[3]