---
title: 毕昇编译器Fortran引导语支持
description: "毕昇编译器支持部分Fortran语言的引导语，用于指示编译器的优化行为。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/compilation/ug-bisheng/kunpengbisheng_06_0015.html
sourcePath: /source/zh/kunpengdevps/compilation/ug-bisheng/kunpengbisheng_06_0015.html
indexId: 3bd8bfd6d2c473cb9f2b9d756594622864bd4193a3144c01d68e5d77f441f8d274
---
# 毕昇编译器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
```


此外还支持指定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)

```
!$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

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

```
!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_func
```


#### !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
```
