毕昇编译器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
父主题: 用户指南