- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
G'day All,
The simple program enclosed seems to indicate a problem in ifort OpenMP compilation of parallel DO loop work-sharing directives that distributes increasing numbers of iterations instead of spreading them evenly amongst threads when the loop index variable 'I' is re-used in later loop statements inside a SINGLE directive. The problem does not occur when the program is modified to use a different variable 'J' instead for the 2nd loop. Nor does this problem occur in equivalent C code.
Am I doing something wrong or is this a bug? And, where/how should it be reported?
Regards,
Sam
Sam
Code:
$ cat incorrect.f
PROGRAM MAIN
INTEGER I, J, OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS
!$OMP PARALLEL PRIVATE(I)
!$OMP DO
do I=1,OMP_GET_NUM_THREADS()
PRINT *, 'TID =', OMP_GET_THREAD_NUM(), 'I =', I
enddo
!$OMP END DO
!$OMP BARRIER
!$OMP SINGLE
do I=1,OMP_GET_NUM_THREADS()
PRINT *, 'TID =', OMP_GET_THREAD_NUM(), 'I =', I
enddo
!$OMP END SINGLE
!$OMP END PARALLEL
END
$ cat correct.f
PROGRAM MAIN
INTEGER I, J, OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS
!$OMP PARALLEL PRIVATE(I)
!$OMP DO
do I=1,OMP_GET_NUM_THREADS()
PRINT *, 'TID =', OMP_GET_THREAD_NUM(), 'I =', I
enddo
!$OMP END DO
!$OMP BARRIER
!$OMP SINGLE
do J=1,OMP_GET_NUM_THREADS()
PRINT *, 'TID =', OMP_GET_THREAD_NUM(), 'J =', J
enddo
!$OMP END SINGLE
!$OMP END PARALLEL
END
$ uname -a
Linux swan.ac3.com.au 2.4.21-sgi303r2 #1 SMP Mon Nov 29 15:29:38 PST 2004 ia64 i
a64 ia64 GNU/Linux
$ ifort -v
Version 9.0
$ ifort -openmp incorrect.f -o incorrect
incorrect.f(10) : (col. 6) remark: OpenMP DEFINED LOOP WAS PARALLELIZED.
incorrect.f(9) : (col. 6) remark: OpenMP DEFINED REGION WAS PARALLELIZED.
$ echo $OMP_NUM_THREADS
8
$ ./incorrect
TID = 0 I = 1
TID = 2 I = 1
TID = 2 I = 2
TID = 2 I = 3
TID = 1 I = 1
TID = 1 I = 2
TID = 7 I = 1
TID = 7 I = 2
TID = 7 I = 3
TID = 7 I = 4
TID = 7 I = 5
TID = 7 I = 6
TID = 7 I = 7
TID = 7 I = 8
TID = 3 I = 1
TID = 3 I = 2
TID = 3 I = 3
TID = 3 I = 4
TID = 4 I = 1
TID = 4 I = 2
TID = 4 I = 3
TID = 4 I = 4
TID = 4 I = 5
TID = 5 I = 1
TID = 5 I = 2
TID = 5 I = 3
TID = 5 I = 4
TID = 5 I = 5
TID = 5 I = 6
TID = 6 I = 1
TID = 6 I = 2
TID = 6 I = 3
TID = 6 I = 4
TID = 6 I = 5
TID = 6 I = 6
TID = 6 I = 7
TID = 4 I = 1
TID = 4 I = 2
TID = 4 I = 3
TID = 4 I = 4
TID = 4 I = 5
TID = 4 I = 6
TID = 4 I = 7
TID = 4 I = 8
$ ifort -openmp correct.f -o correct
correct.f(7) : (col. 6) remark: OpenMP DEFINED LOOP WAS PARALLELIZED.
correct.f(6) : (col. 6) remark: OpenMP DEFINED REGION WAS PARALLELIZED.
$ ./correct
TID = 1 I = 2
TID = 0 I = 1
TID = 2 I = 3
TID = 6 I = 7
TID = 3 I = 4
TID = 7 I = 8
TID = 4 I = 5
TID = 5 I = 6
TID = 4 J = 1
TID = 4 J = 2
TID = 4 J = 3
TID = 4 J = 4
TID = 4 J = 5
TID = 4 J = 6
TID = 4 J = 7
TID = 4 J = 8
$ Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm not familiar with the issues so can't comment on your code, but one reports issues through Intel Premier Support. See this page to get started.
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