- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi
find this little test program with two issues:
MODULE m_common USE, intrinsic :: iso_fortran_env implicit none integer, parameter :: ip = INT32 integer, parameter :: rp = REAL64 END MODULE m_common MODULE m_vec_tens USE m_common implicit none TYPE vec2d real(rp) :: x = 0._rp real(rp) :: y = 0._rp CONTAINS procedure, pass(self) :: equal_vec2d procedure, pass(self) :: add_vec2d procedure, pass(self) :: sub_vec2d procedure, pass(self) :: dotprod_vec2d generic :: assignment(=) => equal_vec2d generic :: operator(+) => add_vec2d generic :: operator(-) => sub_vec2d generic :: operator(.dotprod.) => dotprod_vec2d END TYPE vec2d CONTAINS PURE ELEMENTAL SUBROUTINE equal_vec2d( self , from ) class(vec2d), intent(inout) :: self class(vec2d), intent(in ) :: from self%x = from%x self%y = from%y END SUBROUTINE equal_vec2d PURE ELEMENTAL FUNCTION add_vec2d( self , from ) RESULT( this ) class(vec2d), intent(in) :: self , from type(vec2d) :: this this%x = self%x + from%x this%y = self%y + from%y END FUNCTION add_vec2d PURE ELEMENTAL FUNCTION sub_vec2d( self , from ) RESULT( this ) class(vec2d), intent(in) :: self , from type(vec2d) :: this this%x = self%x - from%x this%y = self%y - from%y END FUNCTION sub_vec2d PURE ELEMENTAL FUNCTION dotprod_vec2d( self , from ) RESULT( dotprod ) class(vec2d), intent(in) :: self , from real(rp) :: dotprod dotprod = self%x * from%x + & self%y * from%y END FUNCTION dotprod_vec2d END MODULE m_vec_tens MODULE m_field USE m_vec_tens TYPE field type(vec2d), allocatable :: v1(:) type(vec2d), allocatable :: v2(:) END TYPE field END MODULE m_field PROGRAM test_vec_tens USE m_field implicit none integer(ip), parameter :: n = 100000 integer(8) :: count , count_scale , count_max integer(ip) :: i , j , k , nt real(rp) :: time , rate real(rp), dimension(n) :: s1 , s2 , s3 , s4 , s5 , s6 type(vec2d), dimension(n) :: v1 , v2 , v3 type(field) :: f call random_number( s3(1:n) ) call random_number( s4(1:n) ) call random_number( s5(1:n) ) call random_number( s6(1:n) ) call random_number( v2(1:n)%x ) call random_number( v2(1:n)%y ) call random_number( v3(1:n)%x ) call random_number( v3(1:n)%y ) call system_clock( count , count_scale , count_max ) rate = real( count_scale , 8 ) time = real( count , 8 ) do nt = 1,1000 s1(1:n) = s3(1:n) + s4(1:n) s2(1:n) = s5(1:n) + s6(1:n) s3(1) = s2(n) s5(1) = s1(n) end do call system_clock( count , count_scale , count_max ) write(6,*) ( real( count , 8 ) - time ) / rate time = real( count , 8 ) ! LOOP BEGIN at test_vec_tens.f90(49,28) inlined into test_vec_tens.f90(166,25) ! remark #25096: Loop Interchange not done due to: Imperfect Loop Nest (Either at Source or due to other Compiler Transformations) ! remark #25451: Advice: Loop Interchange, if possible, might help loopnest. Suggested Permutation : ( 1 2 ) --> ( 2 1 ) ! remark #15344: loop was not vectorized: vector dependence prevents vectorization ! remark #15346: vector dependence: assumed FLOW dependence between 251.Y line 56 and 251.Y line 45 ! remark #15346: vector dependence: assumed ANTI dependence between 251.Y line 45 and 251.Y line 56 ! LOOP BEGIN at test_vec_tens.f90(166,7) ! remark #25427: Loop Statements Reordered ! remark #15344: loop was not vectorized: vector dependence prevents vectorization ! remark #15346: vector dependence: assumed FLOW dependence between 251.Y line 56 and 251.Y line 45 ! remark #15346: vector dependence: assumed ANTI dependence between 251.Y line 45 and 251.Y line 56 ! remark #25438: unrolled without remainder by 2 ! LOOP END ! LOOP END do nt = 1,1000 v1(1:n) = v2(1:n) + v3(1:n) v2(1)%x = v1(n)%y v2(1)%y = v1(n)%x end do call system_clock( count , count_scale , count_max ) write(6,*) ( real( count , 8 ) - time ) / rate allocate( f%v1(n) ) allocate( f%v2(n) ) ! test_vec_tens.f90(187): error #6866: Dotted string is neither a defined operator nor a structure component. [DOTPROD] ! s1(i) = f%v1(i) .dotprod. f%v2(i) ! -----------------------^ ! compilation aborted for test_vec_tens.f90 (code 1) ! do i = 1,n ! s1(i) = f%v1(i) .dotprod. f%v2(i) ! end do v1(1:n) = f%v1(1:n) v2(1:n) = f%v2(1:n) do i = 1,n s1(i) = v1(i) .dotprod. f%v2(i) end do do i = 1,n s1(i) = f%v1(i) .dotprod. v2(i) end do END PROGRAM test_vec_tens
with my configuration:
ifort --version ifort (IFORT) 16.0.1 20151021 Copyright (C) 1985-2015 Intel Corporation. All rights reserved. Linux gmmpc209 4.2.0-35-generic #40-Ubuntu SMP Tue Mar 15 22:15:45 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
first, it seams that there is a bug in compiler considering two allocatable array of vec2d type in field type container when I want to use the generic binding operator .dotprod.
If I copy the array to a local array, no problem in both directions
If I use en interface operator to overload .dotprod. rather than generic binding, no problem at all
secondly, I'm not a expert but I'm little confused with vectorization of my overloaded operators
time computations are very similar if I do not use -ipo optimization flag with other -fast flags for example and very different with
any advices or comments ?
thanks,
Fred Couderc
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have reproduced the error on the operator and open a defect report DPD200410721
Thanks
Xiaoping Duan
Intel Customer Support
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page