# Will if-else inside of an openacc regime affect dependencies?

Hi,

I am using PGI/18.
Thanks for Mat’s previous support, my OpenACC run all right days ago.
However, when I want to add an if-else segment inside of the OpenACC regime, the dependency relationship become strange and prevent parallelism.

I will try to explain the question simply:
!\$acc data
!\$acc parallel loop
Do el=1:N

A(el)=B(el)+C(el) !it runs in parallel all right
end do
!\$acc end data

Now, I add an if-else segment. And here comes the issue:

!\$acc data
!\$acc parallel loop
Do el=1,N
if (domain(el)==1) then !new added

A(el)=B(el)+C(el) !it still runs in parallel all right
else
A(el)=B(el)+C(el) ! same commend, but it says the reuse of A prevent the parallelization
D(el)=D(el)+E(el) ! Here the D also prevents parallelization. But as each thread are with different el, I am sure it should be independent. It seems not suitable for reduction clause here as it is matrix.
end if
end do
!\$acc end data

I have two type of problem. Both prevent me for parallelization. Do you have any suggestion about that?

Thanks,

Wending

Hi Wending,

Do you have a small reproducing example you can share? The if statement itself wouldn’t prevent parallization so there’s probably something specific to your code.

Using what you have posted I wrote the following example, and as you can see that there’s no issue.

-Mat

``````% cat test.f90

subroutine foo(A,B,C,D,E,domain,N)

real, dimension(:) :: A,B,C,D,E
integer, dimension(:) :: domain
integer, value :: N
integer :: el

!\$acc data copyin(C,B,E,domain) copyout(A) copy(D)
!\$acc parallel loop
do el=1,N
if (domain(el) == 1) then
A(el) = B(el)+C(el)
else
A(el) = B(el)+C(el)
D(el) = D(el)+E(el)
endif
enddo
!\$acc end data

end subroutine foo

% nvfortran -c test.f90 -acc -Minfo=accel
foo:
9, Generating copyin(b(:)) [if not already present]
Generating copyout(a(:)) [if not already present]
Generating copyin(e(:),domain(:)) [if not already present]
Generating copy(d(:)) [if not already present]
Generating copyin(c(:)) [if not already present]
10, Generating Tesla code
11, !\$acc loop gang, vector(128) ! blockidx%x threadidx%x``````