在新发布的Intel Fortran Composer XE 2015中英特尔编译器加入了对Fortran 2008标准中引入的Block结构(Block Construct)的支持。Block结构的使用类似于C/C++语言中的复合语句,它使程序员可以更加灵活的创建仅具有局部作用域的数据结构和相关代码。Block结构的语法表示为:
[可选名称:] BLOCK
[可选的数据声明]
block 代码
END BLOCK [名称]
其中的数据声明可以是除了COMMON,EQUIVALENCE,NAMELIST,IMPLICIT等属性之外的数据结构。这些数据可以具有SAVE属性,但该属性仅在所属的Block结构中有效,外部定义的SAVE属性不影响Block内部定义的数据。
考虑下面的例子:
block
integer :: i
real :: a(n)
do i = 1,n
a(i) = i
end do
…
end block
当代码执行到block结构之外后,变量“i”和“a”将恢复它们在block结构之外的含义。
Block结构中可定义局部数据的特性使得它特别适合于和DO CONCURRENT以及自动并行化一起使用,因为使用局部数据可以保证循环结构的不同迭代之间没有数据依赖关系。考虑下面的例子:
DO CONCURRENT(I = 1:N)
BLOCK
REAL T
T = A(I) + B(I)
C(I) = T + SQRT(T)
END BLOCK
END DO
这里通过使用Block结构和局部数据”T”可以保证循环结构的不同迭代之间使用的临时变量”T”不会有任何冲突,这时如果在编译的时候加上“-parallel”选项打开自动并行优化,编译器就会自动为上面的循环生成并行代码。
更多关于如何通过英特尔编译器使用Block结构的信息请参见英特尔编译器用户参考手册的相关内容。