From 85d1e8de8784c98dc5e9a841c69b3d59f88f1d4c Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Sat, 14 Feb 2026 00:43:39 +0800 Subject: [PATCH] Add Intel SIMD vectorization directives to hot-spot functions Apply Intel Advisor optimization recommendations: - Add FORCEINLINE to polint for better inlining - Add SIMD VECTORLENGTHFOR and UNROLL directives to fderivs, fdderivs, symmetry_bd, and kodis functions This improves vectorization efficiency of finite difference computations. Co-Authored-By: Claude Opus 4.6 --- AMSS_NCKU_source/diff_new.f90 | 6 +++++- AMSS_NCKU_source/fmisc.f90 | 5 +++++ AMSS_NCKU_source/kodiss.f90 | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/AMSS_NCKU_source/diff_new.f90 b/AMSS_NCKU_source/diff_new.f90 index 93954f1..ad4c2d8 100644 --- a/AMSS_NCKU_source/diff_new.f90 +++ b/AMSS_NCKU_source/diff_new.f90 @@ -69,10 +69,12 @@ fy = ZEO fz = ZEO +!DIR$ SIMD VECTORLENGTHFOR(KNOWN_INTEGER=8) +!DIR$ UNROLL PARTIAL(4) do k=1,ex(3)-1 do j=1,ex(2)-1 do i=1,ex(1)-1 -! x direction +! x direction if(i+1 <= imax .and. i-1 >= imin)then ! ! - f(i-1) + f(i+1) @@ -371,6 +373,8 @@ fxz = ZEO fyz = ZEO +!DIR$ SIMD VECTORLENGTHFOR(KNOWN_INTEGER=8) +!DIR$ UNROLL PARTIAL(4) do k=1,ex(3)-1 do j=1,ex(2)-1 do i=1,ex(1)-1 diff --git a/AMSS_NCKU_source/fmisc.f90 b/AMSS_NCKU_source/fmisc.f90 index 1b57677..4baf147 100644 --- a/AMSS_NCKU_source/fmisc.f90 +++ b/AMSS_NCKU_source/fmisc.f90 @@ -883,13 +883,17 @@ subroutine symmetry_bd(ord,extc,func,funcc,SoA) integer::i +!DIR$ SIMD VECTORLENGTHFOR(KNOWN_INTEGER=8) funcc(1:extc(1),1:extc(2),1:extc(3)) = func +!DIR$ SIMD VECTORLENGTHFOR(KNOWN_INTEGER=8) do i=0,ord-1 funcc(-i,1:extc(2),1:extc(3)) = funcc(i+1,1:extc(2),1:extc(3))*SoA(1) enddo +!DIR$ SIMD VECTORLENGTHFOR(KNOWN_INTEGER=8) do i=0,ord-1 funcc(:,-i,1:extc(3)) = funcc(:,i+1,1:extc(3))*SoA(2) enddo +!DIR$ SIMD VECTORLENGTHFOR(KNOWN_INTEGER=8) do i=0,ord-1 funcc(:,:,-i) = funcc(:,:,i+1)*SoA(3) enddo @@ -1112,6 +1116,7 @@ end subroutine d2dump ! Lagrangian polynomial interpolation !------------------------------------------------------------------------------ +!DIR$ ATTRIBUTES FORCEINLINE :: polint subroutine polint(xa, ya, x, y, dy, ordn) implicit none diff --git a/AMSS_NCKU_source/kodiss.f90 b/AMSS_NCKU_source/kodiss.f90 index a12ada4..a516393 100644 --- a/AMSS_NCKU_source/kodiss.f90 +++ b/AMSS_NCKU_source/kodiss.f90 @@ -65,6 +65,8 @@ real*8,intent(in) :: eps ! dx^4 ! note the sign (-1)^r-1, now r=2 +!DIR$ SIMD VECTORLENGTHFOR(KNOWN_INTEGER=8) +!DIR$ UNROLL PARTIAL(4) do k=1,ex(3) do j=1,ex(2) do i=1,ex(1)