鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

毕昇编译器Fortran引导语支持

毕昇编译器支持部分Fortran语言的引导语,用于指示编译器的优化行为。

!$mem prefetch

内存引用方面的引导语,指示编译器将特定数据从main memory加载到L1/L2 cache。用法:

1
2
3
4
!$mem prefetch array1, array2, array2(i + 4) 
DO i=1,100 
    array1(i - 1) = array2(i - 1) + array2(i + 1) 
END DO

此外还支持指定cache level和循环迭代提前量的预取,用法:

prefetch表示做预取,其中variable标志预取变量,locality指示cache level(1/2/3代表L1/L2/L3,4代表HBM cache),distance代表循环迭代提前量:

!$mem prefetch(variable, locality, distance)

noprefetch表示不做预取:

!$mem noprefetch(variable)

1
2
3
4
5
!$mem prefetch(array1,4,5)
!$mem noprefetch(array2)
DO i=1,100 
    array1(i - 1) = array2(i - 1) + array2(i + 1) 
END DO

!dir$ ivdep

指示编译器忽略迭代循环的内存依赖性,并进行向量化。用法:

1
2
3
4
!dir$ ivdep 
DO i=1, ub 
    array1(i) = array1(i) + array2(i) 
END DO

!$omp simd

指示编译器将循环转换为SIMD形式。这是一个OpenMP指令,需要指定选项‘-fopenmp’才能生效。用法:

1
2
3
4
!$omp simd 
DO i=1, ub 
    array1(i) = array1(i) + array2(i) 
END DO

该引导语当前不支持任何子句。

!dir$ vector always

通过忽略基于cost的依赖来强制编译器进行循环矢量化,立即作用于紧随其后的循环。该引导语需要添加关键字“always”,并且不支持带关键字“never”。用法:

1
2
3
4
!dir$ vector always 
DO i=1, ub 
    array3(i) = array1(i) - array2(i) 
END DO

!dir$ novector

指示编译器不要进行循环矢量化操作,且与优化等级无关,立即作用于紧随其后的循环。用法:

1
2
3
4
!dir$ novector 
DO i=1, ub 
    array3(i) = array1(i) - array2(i) 
END DO

!dir$ inline

指示编译器对函数进行内联操作,且与优化等级无关,立即作用于紧随其后的循环。用法:

1
2
3
4
5
6
7
!dir$ inline 
real function inline_func (num) 
    implicit none
    real :: num
    inline_func = num + 1234
    return
end function

!dir$ noinline

指示编译器不要对函数进行内联操作,且与优化等级无关,立即作用于紧随其后的循环。用法:

1
2
3
4
5
6
7
8
9
!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_func

!dir$ unroll

指示编译器进行循环展开操作,且与优化等级无关,立即作用于紧随其后的循环。共有3种用法:

1
2
3
4
!dir$ unroll  -- 全展开
DO i=1, ub 
    array3(i) = array1(i) - array2(i) 
END DO
1
2
3
4
!dir$ unroll (4)  -- 展开4次
DO i=1, ub 
    array3(i) = array1(i) - array2(i) 
END DO
1
2
3
4
!dir$ unroll = 2  -- 展开2次
DO i=1, ub 
    array3(i) = array1(i) - array2(i) 
END DO

!dir$ nounroll

指示编译器阻止循环展开操作,立即作用于紧随其后的循环,用法如下:

1
2
3
4
!dir$ nounroll
DO i=1, 100
    array1(i) = 5 
END DO