방법: 동시성 런타임을 사용하기 위해 환산 변수를 사용하는 OpenMP 루프 변환

이 예제에서는 동시성 런타임을 사용하도록 감소 절을 사용하는 OpenMP parallelfor 루프를 변환하는 방법을 보여 줍니다.

OpenMP reduction 절을 사용하면 병렬 영역 끝에서 감소 작업에 적용되는 하나 이상의 스레드-개인 변수를 지정할 수 있습니다.OpenMP는 감소 연산자 집합을 미리 정의합니다.각 감소 변수는 스칼라(예: int, long 및 float)여야 합니다.OpenMP는 병렬 영역에 감소 변수를 사용하는 방법에 대한 몇 가지 제한 사항도 정의합니다.

병렬 패턴 라이브러리 (PPL) 제공의 concurrency::combinable 세밀 한 계산을 수행 하 고 다음 이러한 계산의 최종 결과에 병합할 수 있도록 재사용 가능한, 스레드 로컬 저장소를 제공 하는 클래스입니다.combinable 클래스는 스칼라 형식 및 복합 형식 모두에 동작하는 템플릿입니다.사용 하는 combinable 클래스, 본문에는 병렬 구문 sub-computations을 수행 하 고 호출을 concurrency::combinable::combine 또는 concurrency::combinable::combine_each 최종 결과 생성 하는 방법.combinecombine_each 메서드는 각 요소 쌍을 결합하는 방법을 지정하는 combine 함수를 사용합니다.따라서 combinable 클래스는 고정된 감소 연산자 집합으로 제한되지 않습니다.

예제

이 예제에서는 OpenMP 및 동시성 런타임을 사용하여 처음 35개 피보나치(Fibonacci) 수의 합계를 계산합니다.

// concrt-omp-fibonacci-reduction.cpp
// compile with: /EHsc /openmp
#include <ppl.h>
#include <iostream>

using namespace concurrency;
using namespace std;

// Computes the nth Fibonacci number.
// This function illustrates a lengthy operation and is therefore
// not optimized for performance.
int fibonacci(int n)
{
   if (n < 2)
      return n;

   // Compute the components in parallel.
   int n1, n2;
   parallel_invoke(
      [n,&n1] { n1 = fibonacci(n-1); },
      [n,&n2] { n2 = fibonacci(n-2); }
   );

   return n1 + n2;
}

// Uses OpenMP to compute the sum of Fibonacci numbers in parallel.
void omp_parallel_fibonacci_sum(int count)
{
   int sum = 0;
   #pragma omp parallel for reduction(+ : sum)
      for (int i = 0; i < count; ++i)
      {
         sum += fibonacci(i);
      }

   wcout << L"The sum of the first " << count << L" Fibonacci numbers is " 
         << sum << L'.' << endl;
}

// Uses the Concurrency Runtime to compute the sum of Fibonacci numbers in parallel.
void concrt_parallel_fibonacci_sum(int count) 
{
   combinable<int> sums;
   parallel_for(0, count, [&sums](int i)
      {
         sums.local() += fibonacci(i);
      });

   wcout << L"The sum of the first " << count << L" Fibonacci numbers is " 
         << sums.combine(plus<int>()) << L'.' << endl;
}

int wmain()
{
   const int count = 35;

   wcout << L"Using OpenMP..." << endl;
   omp_parallel_fibonacci_sum(count);

   wcout << L"Using the Concurrency Runtime..." << endl;
   concrt_parallel_fibonacci_sum(count);
}

이 예제의 결과는 다음과 같습니다.

Using OpenMP...
The sum of the first 35 Fibonacci numbers is 14930351.
Using the Concurrency Runtime...
The sum of the first 35 Fibonacci numbers is 14930351.

combinable 클래스에 대한 자세한 내용은 병렬 컨테이너 및 개체를 참조하십시오.

코드 컴파일

예제 코드를 복사 하 고 Visual Studio 프로젝트에 붙여 또는 라는 파일에 붙여 omp 피보나치 reduction.cpp concrt 및 다음 Visual Studio 명령 프롬프트 창에서 다음 명령을 실행 합니다.

cl.exe /EHsc /openmp concrt-omp-fibonacci-reduction.cpp

참고 항목

개념

OpenMP에서 동시성 런타임으로 마이그레이션

병렬 컨테이너 및 개체