跳转到内容

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]
华夏公益教科书