毕昇编译器Fortran引导语支持
毕昇编译器支持部分Fortran语言的引导语,用于指示编译器的优化行为。
!$mem prefetch
内存引用方面的引导语,指示编译器将特定数据从main memory加载到L1/L2 cache。用法:
!$mem prefetch array1, array2, array2(i + 4)
DO i=1,100
array1(i - 1) = array2(i - 1) + array2(i + 1)
END DO
!dir$ ivdep
指示编译器忽略迭代循环的内存依赖性,并进行向量化。用法:
!dir$ ivdep
DO i=1, ub
array1(i) = array1(i) + array2(i)
END DO
!$omp simd
指示编译器将循环转换为SIMD形式。这是一个OpenMP指令,需要指定选项‘-fopenmp’才能生效。用法:
!$omp simd
DO i=1, ub
array1(i) = array1(i) + array2(i)
END DO
该引导语当前不支持任何子句。
!dir$ vector always
通过忽略基于cost的依赖来强制编译器进行循环矢量化,立即作用于紧随其后的循环。该引导语需要添加关键字“always”,并且不支持带关键字“never”。用法:
!dir$ vector always
DO i=1, ub
array3(i) = array1(i) - array2(i)
END DO
!dir$ novector
指示编译器不要进行循环矢量化操作,且与优化等级无关,立即作用于紧随其后的循环。用法:
!dir$ novector
DO i=1, ub
array3(i) = array1(i) - array2(i)
END DO
!dir$ inline
指示编译器对函数进行内联操作,且与优化等级无关,立即作用于紧随其后的循环。用法:
!dir$ inline
real function inline_func (num)
implicit none
real :: num
inline func = num + 1234
return
end function
!dir$ noinline
指示编译器不要对函数进行内联操作,且与优化等级无关,立即作用于紧随其后的循环。用法:
!dir$ noinline
subroutine noinline_func (a, b)
integer, parameter :: m = 10
integer :: a(m), b(m)
integer :: i
do i = 1, m
b(i) = a(i) + 1
end do
end subroutine noinline_subr
!dir$ unroll
指示编译器进行循环展开操作,且与优化等级无关,立即作用于紧随其后的循环。共有3种用法:
!dir$ unroll -- 全展开
DO i=1, ub
array3(i) = array1(i) - array2(i)
END DO
!dir$ unroll (4) -- 展开4次
DO i=1, ub
array3(i) = array1(i) - array2(i)
END DO
!dir$ unroll = 2 -- 展开2次
DO i=1, ub
array3(i) = array1(i) - array2(i)
END DO
!dir$ nounroll
指示编译器阻止循环展开操作,立即作用于紧随其后的循环,用法如下:
!dir$ nounroll
DO i=1, 100
array1(i) = 5
END DO
父主题: 用户指南