Fortran 在simd循环中组合声明simd和内联

Fortran 在simd循环中组合声明simd和内联,fortran,openmp,vectorization,simd,Fortran,Openmp,Vectorization,Simd,我一直在考虑何时在simd循环中内联或使用声明simd。我遇到了这一点,OP有类似的问题,但答案对我来说相当不清楚 我有两个问题: 1) 让声明simd(函数名)和像这样的内联指令都被认为是错误吗!DIR$ATTRIBUTES::FORCEINLINE(函数名) 2) 如何知道使用哪一个 基本示例 !DIR$ ATTRIBUTES :: FORCEINLINE(call_insimd) !$OMP DECLARE SIMD(call_insimd) function call_insimd(a,

我一直在考虑何时在simd循环中内联或使用
声明simd
。我遇到了这一点,OP有类似的问题,但答案对我来说相当不清楚

我有两个问题:

1) 让
声明simd(函数名)
和像
这样的内联指令都被认为是错误吗!DIR$ATTRIBUTES::FORCEINLINE(函数名)

2) 如何知道使用哪一个

基本示例

!DIR$ ATTRIBUTES :: FORCEINLINE(call_insimd)
!$OMP DECLARE SIMD(call_insimd)
function call_insimd(a,b)  result(res)
implicit none 
real, intent(in) :: a,b 
real, intent(out):: res 
end function
主回路中

do i = 1,10000 
!dir$ forceinline

  ar(i) = call_insimd(gf(i),df(i)) 

enddo

除非您关心多个编译器不能同时识别这两个编译器的可能性,否则似乎没有什么理由同时包含这两个编译器。内联有潜在的优点和缺点,如果您只关心simd,您可能会忽略这些优点和缺点。我应该在什么时候使用它。似乎对于simd循环,函数调用有两个选项,一个是内联,另一个是声明simd——我想有时使用一个比另一个更好?我通常做一个!DIR ALIGN,编译器和编译器优化-02通常与向量报告一起显示函数是SIMD向量化的。强制将其矢量化也是一种选择,但两种方法都会得到相同的结果。