다음을 통해 공유


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

이 예제에서는 동시성 런타임을 사용하기 위해 감소 절을 사용하는 루프용 OpenMP 병렬을 변환하는 방법을 보여 줍니다.

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

PPL(병렬 패턴 라이브러리)은 동시성::결합 가능한 클래스를 제공합니다. 이 클래스는 세분화된 계산을 수행한 다음 해당 계산을 최종 결과로 병합할 수 있는 재사용 가능한 스레드 로컬 스토리지를 제공합니다. combinable 클래스는 스칼라 형식과 복합 형식 모두에서 작동하는 템플릿입니다. 클래스를 combinable 사용하려면 병렬 구문 본문에서 하위 계산을 수행한 다음 동시성::combinable::combine 또는 concurrency::combinable::combine_each 메서드를 호출하여 최종 결과를 생성합니다. 각 메서드와 메서드는 combine 각 요소 쌍을 결합하는 방법을 지정하는 결합 함수를 사용합니다.combine_each 따라서 combinable 클래스는 고정된 감소 연산자 집합으로 제한되지 않습니다.

예시

이 예제에서는 OpenMP와 동시성 런타임을 모두 사용하여 처음 35개의 피보나치 숫자의 합계를 계산합니다.

// 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 프로젝트에 붙여넣거나 이름이 지정된 concrt-omp-fibonacci-reduction.cpp 파일에 붙여넣은 다음 Visual Studio 명령 프롬프트 창에서 다음 명령을 실행합니다.

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

참고 항목

OpenMP에서 동시성 런타임으로 마이그레이션
병렬 컨테이너 및 개체