2.7.2.6 감소
나타나는 스칼라 변수에서이 절을 감소 수행 변수 목록, 운영자 op 사용 합니다.구문에는 reduction 절은 다음과 같습니다:
reduction(op:variable-list)
일반적으로 감소 문으로 다음 형식 중 하나를 지정 합니다.
x = x op expr
x binop= expr
x = expr op x (except for subtraction)
x++
++x
x--
--x
다음은 각 문자에 대한 설명입니다.
x
지정 된 감소 변수 중 하나는 list.변수 목록
감소 스칼라 변수 목록을 쉼표로 구분 합니다.expr 인수
식을 사용 하 여 참조 되지 않은 스칼라 형식 x.op
오버 로드 된 연산자 중 하나를 제외한 +, *,-, &, ^, |, & &, 또는 | |.binop
오버 로드 된 연산자 중 하나를 제외한 +, *,-, &, ^, 나.
다음은 예입니다 있는 reduction 절.
#pragma omp parallel for reduction(+: a, y) reduction(||: am)
for (i=0; i<n; i++) {
a += b[i];
y = sum(y, c[i]);
am = am || b[i] == c[i];
}
예제에서와 같이 연산자 함수 호출 내부를 숨길 수 있습니다.사용자가 연산자에 지정 된 주의 해야 있는 reduction 절과 일치 하는 축소 작업.
하지만의 오른쪽 피연산자는 | | 연산자이 예제에서는 의도 된, 사용할 수 있지만 주의 해 서 사용 해야 합니다.이 컨텍스트에서 순차 루프를 실행 하는 동안 발생 하지 해야 부작용 병렬 실행 하는 동안 발생할 수 있습니다.반복의 실행 순서를 결정 되지 않은 때문에 이러한 차이가 발생할 수 있습니다.
운영자 감소에 대해 컴파일러에서 사용 되는 모든 개인 변수의 초기 값을 확인 하 고 종료 연산자를 확인에 사용 됩니다.연산자를 명시적으로 지정 구문 어휘 범위 밖으로 감소 문이 있습니다.원하는 수의 reduction 절을 지시문에서 지정할 수 있지만 변수를 최대 하나만 표시 될 수 있습니다 reduction 지시문에 대 한 절.
개인 복사본에서 각 변수 변수 목록 , 각 스레드에 대 한 만들어집니다 처럼는 private 절을 사용 했습니다.개인 복사 연산자에 따라 초기화 됩니다 (다음 표 참조).
해당 지역에 있는 끝에는 reduction 절 지정 되었습니다, 원래 개체의 원래 값과 최종 값을 각각 지정 된 연산자를 사용 하 여 개인 복사본에 결합 한 결과 반영 하도록 업데이트 됩니다.감소 연산자 (빼기)를 제외 하 고 모두 연관 되 고 컴파일러 자유롭게 최종 값의 다시 연결 될 수 있습니다.(일부 결과의 빼기 감소는 최종 값에 추가 됩니다.)
첫 번째 스레드가 포함 된 절에 도달 하 고 감소 계산이 완료 될 때까지 그렇게 남아 경우 원래 개체의 값을 비활성화 상태가 됩니다.일반적으로 계산 된 구조 끝에 완료 됩니다. 그러나 경우는 reduction 절을 사용 하는 구문에 nowait 입니다 장애물 동기화 스레드를 모두 완료 했는지 확인 하려면 완료할 때까지 적용, 원래 개체의 값을 결정할 수 없는 남아 있는 reduction 절.
다음 표에서 사용할 수 있는 연산자 및 정식 초기화 값을 나열 합니다.실제 초기화 값 감소 변수 데이터 형식으로 일관 되 게 됩니다.
Operator |
초기화 |
---|---|
+ |
0 |
* |
1 |
- |
0 |
& |
~0 |
| |
0 |
^ |
0 |
&& |
1 |
|| |
0 |
제한에는 reduction 절은 다음과 같습니다:
형식에 있는 변수는 reduction 절 여야 감소 연산자에 대 한 유효한 포인터 형식 및 참조 형식에는 허용 되지 것을 제외 하 고.
지정 된 변수를 reduction 절 이어야 const-한정 된.
변수는 병렬 영역 내부에서는 개인 또는 표시에 reduction 절에 병렬 지시문에 지정 될 수 없습니다는 reduction 병렬 구문에 바인딩되는 작업 공유 지시문의 절.
#pragma omp parallel private(y) { /* ERROR - private variable y cannot be specified in a reduction clause */ #pragma omp for reduction(+: y) for (i=0; i<n; i++) y += b[i]; } /* ERROR - variable x cannot be specified in both a shared and a reduction clause */ #pragma omp parallel for shared(x) reduction(+: x)