- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
i was chasing data race conditions in an omp environment and found that having a derived type with allocatable components the culprit. According to google there was once a problem but I wonder whether it is still virulent.
Here is an example code:
Module rrr Type :: aaa real(kind=8), allocatable :: b(:,:) end type aaa contains Subroutine Subrrr(a) real(kind=8), intent(inout) :: a(:,:) write(*,*) loc(a) end Subroutine Subrrr Subroutine Subzzz(a) type(aaa), intent(inout) :: a(:) integer :: i do i=1,size(a) write(*,*) i,loc(a(i)%b) end do end Subroutine Subzzz end Module rrr Program test use rrr, only: subrrr, aaa, subzzz real(kind=8), allocatable :: x(:,:) integer :: i type(aaa), allocatable :: y(:) allocate(y(1)) do i=1,size(y) allocate(y(i)%b(20,20),source=0.0D0) write(*,*) i,loc(y(i)%b) end do write(*,*) "@@@@@@@@@@@@@@@@@@@" !$omp parallel do firstprivate(y) Do i=1,10 call subzzz(y) end Do !$omp end parallel do write(*,*) "@@@@@@@@@@@@@@@@@@@" allocate(x(20,20),source=0.0D0) write(*,*) loc(x) !$omp parallel do firstprivate(x) Do i=1,10 call subrrr(x) end Do !$omp end parallel do end Program test
When compiled with ifort 17.08 or 19.04 and the -qopenmp flag only the ouptut is
1 23209329389632 @@@@@@@@@@@@@@@@@@@ 1 23209329389632 1 23209329389632 1 23209329389632 1 23209329389632 1 23209329389632 1 23209329389632 1 23209329389632 1 23209329389632 1 23209329389632 1 23209329389632 @@@@@@@@@@@@@@@@@@@ 23209329385600 140720494867472 23194232672272 23202940038928 23207230320272 23192018079760 23200742231824 23209327480336 23205037198992 23196430479248 23198527639440
when compiled with "gfortran -fopenmp" the output is:
1 94311007887248 @@@@@@@@@@@@@@@@@@@ 1 94311007930896 1 22394831899520 1 22394764790656 1 22394764791344 1 94311007932272 1 22394496355200 1 22394630572928 1 22394362137472 1 22393422613376 1 22394295028608 @@@@@@@@@@@@@@@@@@@ 94311007932272 22394831900208 22394764791344 22394362137472 22394764791344 94311007935488 22394295028608 22394496355200 94311007935488 22393422613376 22394630572928
So it looks as if when compiled with ifort, the array y(i)%b is not copied, where as when using gfortran it is.
Any idea?
Cheers
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
>>So it looks as if when compiled with ifort, the array y(i)%b is not copied, where as when using gfortran it is
On line 14, add to the write , omp_get_thread_num()
IOW the parallel do loop might not have had chunk size of 1.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
thanks. After adding omp_get_thread_num() the output is:
1 23453246234752 @@@@@@@@@@@@@@@@@@@ 2 1 23453246234752 4 1 23453246234752 6 1 23453246234752 5 1 23453246234752 7 1 23453246234752 3 1 23453246234752 1 1 23453246234752 1 1 23453246234752 0 1 23453246234752 0 1 23453246234752 @@@@@@@@@@@@@@@@@@@ 23453246230720 140733095199120 23446830436112 23451147206288 140733095199120 23440169873296 23449050046096 23442267033488 23453244366352 23453244366352 23444615843600
So it looks as if all 8 threads access the same array.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The workaround might be:
Module rrr !$ use omp_lib Type :: aaa real(kind=8), allocatable :: b(:,:) end type aaa contains Subroutine Subzzz(a) type(aaa), intent(inout) :: a(:) integer :: i do i=1,size(a) write(*,*) omp_get_thread_num(),i,loc(a(i)%b) end do end Subroutine Subzzz end Module rrr Program test use rrr, only: aaa, subzzz integer :: i type(aaa), allocatable :: y(:) write(*,*) "@@@@@@@@@@@@@@@@@@@" !$omp parallel private(y) allocate(y(1)) Do i=1,size(y) allocate(y(i)%b(20,20),source=0.0D0) end Do !$omp do Do i=1,10 call subzzz(y) end Do !$omp end do !$omp end parallel end Program test
with the ouput changing to
0 1 23439116902528 6 1 23439116513344 5 1 23439116382272 0 1 23439116902528 4 1 23439116480576 3 1 23439116447808 1 1 23439116415040 1 1 23439116415040 2 1 23439116546112 7 1 23439116316736
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
FWIW, there used to be an issue with earlier compilers where private(a) on an unallocated array a would not (necessarily) present an unallocated array a inside the parallel region. The work around was to use firstprivate(a) with the unallocated array a (thus copying the unallocated array descriptor). I do not recall which version fixed this issue.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks Jim.
cheers

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page