Quantcast
Channel: Intel® Software - Intel® Fortran Compiler for Linux* and macOS*
Viewing all articles
Browse latest Browse all 2746

Sharing a private variable with tasks

$
0
0

Hello,
consider the case where a single thread (say, the master) has a private vector x and submits a number of tasks which update different coefficients of x. Here is a simple (fortran) code that does this

program main
  implicit none
  integer, allocatable :: x(:)
  integer              :: m, j
  m = 10
 
  !$omp parallel private(x)
  !$omp master
  allocate(x(m))
  do j=1, m
     !$omp task firstprivate(j) shared(x)
     x(j) = j
     !$omp end task
  end do
  !$omp taskwait
  deallocate(x)
  !$omp end master
  !$omp end parallel
  stop
end program main

	

I would like to know whether this code is OpenMP compliant and/or correct.
My understanding is that the shared clause in the task construct is such that within the task the actual x array is the one that was allocated by the master, regardless of the thread executing the task. Is this correct?

This code does not work with intel ifort. The compiler complains about x not being allocated (if I turn on the compiler bounds check whistles). If I remove the deallocate statement then the code works ok but because of the taskwait, the deallocation should not be executed before all the tasks are done and thus this behavior seems totally strange to me. Also, the code works fine if I make x a pointer instead of an allocatable.

The code works fine with gfortran.

Is this an ifort bug?

Kind regards,
alfredo


Viewing all articles
Browse latest Browse all 2746


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>