private Clause
10.3. private Clause#
In the following example, the values of original list items i and j are retained on exit from the parallel region, while the private list items i and j are modified within the parallel construct.
//%compiler: clang
//%cflags: -fopenmp
/*
* name: private.1
* type: C
*/
#include <stdio.h>
#include <assert.h>
int main()
{
int i, j;
int *ptr_i, *ptr_j;
i = 1;
j = 2;
ptr_i = &i;
ptr_j = &j;
#pragma omp parallel private(i) firstprivate(j)
{
i = 3;
j = j + 2;
assert (*ptr_i == 1 && *ptr_j == 2);
}
assert(i == 1 && j == 2);
return 0;
}
!!%compiler: gfortran
!!%cflags: -fopenmp
! name: private.1
! type: F-fixed
PROGRAM PRIV_EXAMPLE
INTEGER I, J
I = 1
J = 2
!$OMP PARALLEL PRIVATE(I) FIRSTPRIVATE(J)
I = 3
J = J + 2
!$OMP END PARALLEL
PRINT *, I, J ! I .eq. 1 .and. J .eq. 2
END PROGRAM PRIV_EXAMPLE
In the following example, all uses of the variable a within the loop construct in the routine f refer to a private list item a , while it is unspecified whether references to a in the routine g are to a private list item or the original list item.
//%compiler: clang
//%cflags: -fopenmp
/*
* name: private.2
* type: C
*/
int a;
void g(int k) {
a = k; /* Accessed in the region but outside of the construct;
* therefore unspecified whether original or private list
* item is modified. */
}
void f(int n) {
int a = 0;
#pragma omp parallel for private(a)
for (int i=1; i<n; i++) {
a = i;
g(a*2); /* Private copy of "a" */
}
}
!!%compiler: gfortran
!!%cflags: -fopenmp
! name: private.2
! type: F-fixed
MODULE PRIV_EXAMPLE2
REAL A
CONTAINS
SUBROUTINE G(K)
REAL K
A = K ! Accessed in the region but outside of the
! construct; therefore unspecified whether
! original or private list item is modified.
END SUBROUTINE G
SUBROUTINE F(N)
INTEGER N
REAL A
INTEGER I
!$OMP PARALLEL DO PRIVATE(A)
DO I = 1,N
A = I
CALL G(A*2)
ENDDO
!$OMP END PARALLEL DO
END SUBROUTINE F
END MODULE PRIV_EXAMPLE2
The following example demonstrates that a list item that appears in a private clause in a parallel construct may also appear in a private clause in an enclosed worksharing construct, which results in an additional private copy.
//%compiler: clang
//%cflags: -fopenmp
/*
* name: private.3
* type: C
*/
#include <assert.h>
void priv_example3()
{
int i, a;
#pragma omp parallel private(a)
{
a = 1;
#pragma omp parallel for private(a)
for (i=0; i<10; i++)
{
a = 2;
}
assert(a == 1);
}
}
!%compiler: gfortran
!!%cflags: -fopenmp
! name: private.3
! type: F-fixed
SUBROUTINE PRIV_EXAMPLE3()
INTEGER I, A
!$OMP PARALLEL PRIVATE(A)
A = 1
!$OMP PARALLEL DO PRIVATE(A)
DO I = 1, 10
A = 2
END DO
!$OMP END PARALLEL DO
PRINT *, A ! Outer A still has value 1
!$OMP END PARALLEL
END SUBROUTINE PRIV_EXAMPLE3