For this code:

program F03_2_9_4_1_1a
   implicit none
   logical :: fail = .false.
   call sub1(fail)
   if (fail) stop 1

 contains

  subroutine sub1(fail)
   use omp_lib
   implicit none
   integer, parameter :: NT = 4
   logical :: fail
   integer :: i
   real, allocatable, save :: A(:)
   real :: correct_result(NT)   ! if (A = correct_result) then test passes

   !$omp threadprivate(A)

   allocate(A(NT))

   call omp_set_num_threads(NT)
   call omp_set_dynamic(.false.)

   call random_number(correct_result)

   A = correct_result

   !$omp parallel copyin(A)
   ! Each thread checks its threadprivate copy of A in a "critical" region to
   ! attempt to avoid mangling any output.
   !$omp critical
   do i = 1,NT
      ! correct_result has "shared" data-sharing attribute by default
      if (A(i) /= correct_result(i)) then
         print *, 'FAIL: omp_get_thread_num() == ', omp_get_thread_num(), &
                  ' A(', i, ') = ', A(i), '(expected ', correct_result(i), ')'
         fail = .true.
      end if
   end do
   !$omp end critical
   !$omp end parallel

  end subroutine sub1
end program F03_2_9_4_1_1a
>
> gfortran -fopenmp test.f90
> ./a.out
Segmentation fault
> 

Information from the OpenMP testers:

! NOTES
!     In OpenMP 2.5, ALLOCATABLE arrays were not allowed in a copyin clause.
!
!     OpenMP 3.0, p. 102, line 17 states "Each thread's copy of that array must
!     be allocated with the same bounds."  This seems to imply that the
!     programmer must explicitly allocate each thread's copy of the array, but
!     p. 101, lines 22-24 states "On entry to any parallel region, each
thread's
!     copy of a variable that is affected by a copyin clause for the parallel
!     region will acquire the allocation... status of the master thread's copy.
!
! REFERENCES
!    OpenMP 3.0, p.  85, lines 12-13  (SAVE attribute needed if not in module 
!      or main (F08))
!    OpenMP 3.0, p. 102, line 17
!    OpenMP 3.0, p. 316, lines 18-20 

The error appears to be internal to the OpenMP library:

Program terminated with signal 11, Segmentation fault.
#0  0x000000000044f150 in memcpy ()
(gdb) where
#0  0x000000000044f150 in memcpy ()
#1  0x000000000040077e in sub1.1533.omp_fn.0 (.omp_data_i=0x7fffffffbbc0) at
ISU3230.f90:46
#2  0x000000000041eea6 in gomp_thread_start (xdata=<value optimized out>)
    at ../../../xt-gcc-4.4.2/libgomp/team.c:115
#3  0x00000000004163d3 in start_thread ()
#4  0x0000000000454eb9 in clone ()
#5  0x0000000000000000 in ?? ()
(gdb) q


The code does execute without error with another compiler.


-- 
           Summary: OpenMP threadprivate allocatable saved variable -> seg
                    fault
           Product: gcc
           Version: 4.4.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: longb at cray dot com
 GCC build triplet: x86_64-suse-linux
  GCC host triplet: x86_64-suse-linux
GCC target triplet: x86_64-suse-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42865

Reply via email to