Skip to content

[Flang][OpenMP] Program with TASKLOOP construct containing LASTPRIVATE clause do not terminate the execution #186286

@ohno-fj

Description

@ohno-fj
Version of flang : 23.0.0(ae282974b8a40e20a4c55dfffba84d24db843d74)/AArch64

In the attached program (sample.f90), TASKLOOP construct containing LASTPRIVATE clause does not terminate.
As shown in the results below, the program continued running for over 10 minutes, so I forcibly terminated the execution.
The execution using Gfortran or ifx completes within one second.

In the following cases, the execution completes within one second:

  • Do not specify the compilation option (-fopenmp)
  • Set the environment variable (OMP_NUM_THREADS) to 1
  • Delete TASKLOOP construct
    The above is sample1.f90.
  • Delete LASTPRIVATE clause specified in TASKLOOP construct
    The above is sample5.f90.

The following are the test program, Flang, Gfortran and ifx compilation/execution results.

sample.f90:

subroutine sub()
  integer,allocatable::a(:)
  integer::i, nt
!$ integer omp_get_thread_num
  allocate(a(100))
  a=-1
  nt=0
  print *,'start taskloop'
!$omp taskloop lastprivate(a)
  do i=1,1
     print *,'in taskoop'
!$ nt = omp_get_thread_num() + 1
  end do
!$omp end taskloop
  print *,'out taskoop'
end subroutine sub

program main
!$omp parallel
!$omp master
  call sub()
!$omp end master
!$omp end parallel
  print *,'pass'
end program main
$ export OMP_NUM_THREADS=2; flang -fopenmp sample.f90; time ./a.out
 start taskloop
  C-c C-c
real    10m3.753s
user    0m0.306s
sys     0m0.113s

$
$ flang sample.f90; time ./a.out
 start taskloop
 in taskoop
 out taskoop
 pass

real    0m0.014s
user    0m0.005s
sys     0m0.000s
$
$ export OMP_NUM_THREADS=1; flang -fopenmp sample.f90; time ./a.out
 start taskloop
 in taskoop
 out taskoop
 pass

real    0m0.028s
user    0m0.002s
sys     0m0.017s
$
$ export OMP_NUM_THREADS=2; gfortran -fopenmp sample.f90; time ./a.out
 start taskloop
 in taskoop
 out taskoop
 pass

real    0m0.051s
user    0m0.002s
sys     0m0.019s
$
$ export OMP_NUM_THREADS=2; ifx -qopenmp sample.f90; time ./a.out
 start taskloop
 in taskoop
 out taskoop
 pass

real    0m0.049s
user    0m0.606s
sys     0m0.054s
$

sample1.f90:

subroutine sub()
  integer,allocatable::a(:)
  integer::i, nt
!$ integer omp_get_thread_num
  allocate(a(100))
  a=-1
  nt=0
  print *,'start taskloop'
! !$omp taskloop lastprivate(a)
  do i=1,1
     print *,'in taskoop'
!$ nt = omp_get_thread_num() + 1
  end do
! !$omp end taskloop
  print *,'out taskoop'
end subroutine sub

program main
!$omp parallel
!$omp master
  call sub()
!$omp end master
!$omp end parallel
  print *,'pass'
end program main
$ export OMP_NUM_THREADS=2; flang -fopenmp sample1.f90; time ./a.out
 start taskloop
 in taskoop
 out taskoop
 pass

real    0m0.029s
user    0m0.002s
sys     0m0.017s
$

sample5.f90:

subroutine sub()
  integer,allocatable::a(:)
  integer::i, nt
!$ integer omp_get_thread_num
  allocate(a(100))
  a=-1
  nt=0
  print *,'start taskloop'
!$omp taskloop
  do i=1,1
     print *,'in taskoop'
!$ nt = omp_get_thread_num() + 1
  end do
!$omp end taskloop
  print *,'out taskoop'
end subroutine sub

program main
!$omp parallel
!$omp master
  call sub()
!$omp end master
!$omp end parallel
  print *,'pass'
end program main
$ export OMP_NUM_THREADS=2; flang -fopenmp sample5.f90; time ./a.out
 start taskloop
 in taskoop
 out taskoop
 pass

real    0m0.032s
user    0m0.006s
sys     0m0.015s
$

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions