- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Good day,
I have coded a simple test:
[fxfortran]MODULE foo_module
IMPLICIT NONE
!
!
PRIVATE
!
type, public :: foo
integer :: xx
CONTAINS
procedure :: set => set_sub
procedure :: bar => bar_fn
generic :: operator(+) => foo_plus_foo
procedure, private :: foo_plus_foo => foo_plus_foo_fn
end type foo
!
CONTAINS
!
ELEMENTAL subroutine set_sub(this, xx)
implicit none
class(foo), intent(INOUT) :: this
integer, intent(IN) :: xx
this%xx = xx
return
end subroutine set_sub
!
!
ELEMENTAL integer function bar_fn(this) RESULT(res)
implicit none
class(foo), intent(IN) :: this
res = this%xx * this%xx
return
end function bar_fn
!
!
ELEMENTAL type(foo) function foo_plus_foo_fn(f1, f2) RESULT(res)
implicit none
class(foo), intent(IN) :: f1, f2
res%xx = f1%xx + f2%xx
return
end function foo_plus_foo_fn
!
!
END MODULE foo_module
PROGRAM main
USE foo_module
IMPLICIT NONE
type(foo) :: f, f_sum
integer :: i, y
!$OMP parallel
!$OMP single
call f_sum%set(0)
!$OMP end single
!$OMP do PRIVATE(i,f,y) ! REDUCTION(+:f_sum)
do i = 1, 10
call f%set(i)
y = f%bar()
write( *, * ) i, y
call f%set(y)
f_sum = f_sum + f
end do
!$OMP end do
!$OMP single
write( *, * ) 'f_sum is ', f_sum%xx
!$OMP end single
!$OMP end parallel
y = 0
do i = 1, 10
y = y + i**2
end do
write( *, * ) 'y', y !
END PROGRAM main
[/fxfortran] Is it correct example? In this case each threads get private i,f,y variables and work with them copies.
Should I specify a REDUCTION directive in a OMP-pragma?
Best regards, Oleg.
Link Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I think a bit about it.
This is a model code that reproduces a piece of my prject code. This realization is closer to my project than first one.
[fortran]MODULE foo_module
IMPLICIT NONE
!
!
PRIVATE
!
type, public :: foo
double precision :: xx
CONTAINS
procedure :: init => init_sub
generic :: operator(+) => foo_plus_foo_fn
procedure, private :: foo_plus_foo_fn
end type foo
!
CONTAINS
!
subroutine init_sub(this, xx)
implicit none
class(foo), intent(INOUT) :: this
double precision, intent(IN) :: xx
this%xx = xx
return
end subroutine init_sub
!
!
ELEMENTAL type(foo) function foo_plus_foo_fn(f1, f2) RESULT(res)
implicit none
class(foo), intent(IN) :: f1, f2
res%xx = f1%xx + f2%xx
return
end function foo_plus_foo_fn
!
!
END MODULE foo_module
PROGRAM main
USE foo_module
IMPLICIT NONE
type(foo) :: f, f_sum
double precision :: y = 0.
integer :: i
!$OMP parallel
!$OMP do PRIVATE(i,f) REDUCTION(+:y)
do i = 1, 5
call f%init(dble(i))
y = y + f%xx
f_sum = f_sum + f ! I would like to implement this behaviour.
end do
!$OMP end do
!$OMP single
write( *, '( :, 1X, 3(1X, A, f17.10) )' ) 'f_sum is ', f_sum%xx, 'y_sum is ', y, 'abs', abs(y-f_sum%xx)
!$OMP end single
!$OMP end parallel
END PROGRAM main[/fortran] Does anybody have any idea how to sum a derived-type variable?
Best, Oleg.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
type(foo) :: f, f_sum, f_sumLocal
...
call f_sum%init(0.0D0)
!$omp parallel private(i, f, f_sumLocal)
call f_sumLocal%init(0.0D0)
$omp do...
...
f_sumLocal = f_sumLocal + f
end do
!$omp end do
!$omp critical(critical_for_f_sum)
f_sum = f_sum + f_sumLocal
!$omp end critical(critical_for_f_sum)
!$omp end parallel
Jim Dempsey
...
call f_sum%init(0.0D0)
!$omp parallel private(i, f, f_sumLocal)
call f_sumLocal%init(0.0D0)
$omp do...
...
f_sumLocal = f_sumLocal + f
end do
!$omp end do
!$omp critical(critical_for_f_sum)
f_sum = f_sum + f_sumLocal
!$omp end critical(critical_for_f_sum)
!$omp end parallel
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Or you could add a type member function called... reduce that contains the critical section with the +.
...
!$omp end do
f_sum%reduce(f_sumLocal)
!$omp end parallel
Jim Dempsey
...
!$omp end do
f_sum%reduce(f_sumLocal)
!$omp end parallel
Jim Dempsey
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page