- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am working with these codes (as I post below 2 codes: the original and with omp simd function vectorization). This is the original code, that I want to vectorize:
PROGRAM TEST
IMPLICIT NONE
REAL(KIND=8), DIMENSION(2000):: A,B,C
REAL(KIND=8)::TIME1,TIME2
INTEGER::I,K
!Initial condition
!$OMP SIMD !This part of course could be vectorized
DO I=1, 2000 !even without !$OMP SIMD statement
A(I)=2.0+I/100
B(I)=1.0+I/200
C(I)=0.2+I/500
END DO
!$OMP END SIMD
CALL CPU_TIME(TIME1)
DO K=1, 1000000
!$OMP SIMD !This part which I want to vectorize
DO I=1, 2000 !but of course it was not, since
IF(A(I)>0.0) THEN !if-else statement exists
C(I)=A(I)+B(I)
ELSE
C(I)=2.0*I
END IF
END DO
!$OMP END SIMD
END DO
CALL CPU_TIME(TIME2)
PRINT *, 'C(2000) = ', C(2000)
PRINT *, 'Elapsed real time = ', TIME2-TIME1, 'second(s)'
END PROGRAM TEST
I know when the "if-else" statement exists, the compiler couldn't do the auto-vectorization, and in my case it also didn't work even I've put !$OMP DO SIMD, which is clear. And also to my knowledge only the intrinsic function could be vectorized automatically by the compiler. A few days ago, I just read a presentation which there is a chance to vectorize a function using "OMP SIMD FUNCTION VECTORIZATION". So I try changing the original code as below:
PROGRAM TEST
IMPLICIT NONE
REAL(KIND=8), DIMENSION(2000):: A,B,C
REAL(KIND=8)::TIME1,TIME2
REAL(KIND=8), EXTERNAL::VEC
INTEGER::I,K
!Initial condition
!$OMP SIMD
DO I=1, 2000
A(I)=2.0+I/100
B(I)=1.0+I/200
C(I)=0.2+I/500
END DO
!$OMP END SIMD
CALL CPU_TIME(TIME1)
DO K=1, 1000000
!$OMP SIMD
DO I=1, 2000
C(I)=VEC(A(I),B(I),I)
END DO
!$OMP END SIMD
END DO
CALL CPU_TIME(TIME2)
PRINT *, 'C(2000) = ', C(2000)
PRINT *, 'Elapsed real time = ', TIME2-TIME1, 'second(s)'
END PROGRAM TEST
FUNCTION VEC(IN1,IN2,IN3) RESULT(OUT1)
IMPLICIT NONE
REAL(KIND=8)::IN1,IN2,OUT1
INTEGER::IN3
!IN1 = A(I)
!IN2 = B(I)
!IN3 = I
!$OMP DECLARE SIMD(VEC)
IF(IN1>0.0) THEN
OUT1=IN1+IN2
ELSE
OUT1=2.0*IN3
END IF
END FUNCTION VEC
but the vectorization still didn't work. Do you have any idea, how could I vectorize with this !$OMP SIMD? Or it also couldn't be vectorized (it's just a same case with the failure of auto vectorization by the compiler when non-intrinsic function exists)? Any helps will be appreciated. Thanks in advance.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You didn't update this consistently when you edited it from the version you asked on stackoverflow. Did my comments appear there?
However, it's hard to guess how you could miss. I don't have a Linux box here, but:
ifort -Qopt-report4 -align:array32byte -Qopenmp-simd bobby.f90
LOOP BEGIN at C:\users\tim\tim\tim\src\net\bobby.f90(20,13)
remark #15388: vectorization support: reference C(I) has aligned access
[ C:\users\tim\tim\tim\src\net\bobby.f90(22,19) ]
remark #15388: vectorization support: reference A(I) has aligned access
[ C:\users\tim\tim\tim\src\net\bobby.f90(22,24) ]
remark #15388: vectorization support: reference B(I) has aligned access
[ C:\users\tim\tim\tim\src\net\bobby.f90(22,29) ]
remark #15305: vectorization support: vector length 4
remark #15309: vectorization support: normalized vectorization overhead 0.
053
remark #15417: vectorization support: number of FP up converts: single pre
cision to double precision 1 [ C:\users\tim\tim\tim\src\net\bobby.f90(22,19) ]
remark #15301: OpenMP SIMD LOOP WAS VECTORIZED
remark #15448: unmasked aligned unit stride loads: 2
remark #15449: unmasked aligned unit stride stores: 1
remark #15475: --- begin vector loop cost summary ---
remark #15476: scalar loop cost: 29
remark #15477: vector loop cost: 9.500
remark #15478: estimated potential speedup: 3.050
remark #15487: type converts: 3
remark #15488: --- end vector loop cost summary ---
remark #25456: Number of Array Refs Scalar Replaced In Loop: 2
remark #25015: Estimate of max trip count of loop=500
LOOP END
As I said, if you were using gfortran (you didn't say) you might replace the if then else by MERGE, and possibly set -O3 -ffast-math.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page