방법: 동시성 런타임을 사용하기 위해 환산 변수를 사용하는 OpenMP 루프 변환
이 예제에서는 동시성 런타임을 사용하도록 reduction 절을 사용하는 OpenMP parallel for 루프를 변환하는 방법을 보여 줍니다.
OpenMP reduction 절을 사용하면 병렬 영역 끝에서 감소 작업에 적용되는 하나 이상의 스레드-개인 변수를 지정할 수 있습니다. OpenMP는 감소 연산자 집합을 미리 정의합니다. 각 감소 변수는 스칼라(예: int, long 및 float)여야 합니다. OpenMP는 병렬 영역에 감소 변수를 사용하는 방법에 대한 몇 가지 제한 사항도 정의합니다.
PPL(병렬 패턴 라이브러리)에서는 Concurrency::combinable 클래스를 제공합니다. 이 클래스는 세분화된 계산을 수행한 후 이러한 계산을 최종 결과로 병합하는 데 사용할 수 있는 재사용 가능한 스레드 로컬 저장소를 제공합니다. combinable 클래스는 스칼라 형식 및 복합 형식 모두에 동작하는 템플릿입니다. combinable 클래스를 사용하려면 병렬 구문의 본문에서 하위 계산을 수행한 다음 Concurrency::combinable::combine or Concurrency::combinable::combine_each 메서드를 호출하여 최종 결과를 생성합니다. combine 및 combine_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 프로젝트 또는 concrt-omp-fibonacci-reduction.cpp 파일에 붙여 넣고 Visual Studio 2010 명령 프롬프트 창에서 다음 명령을 실행합니다.
cl.exe /EHsc /openmp concrt-omp-fibonacci-reduction.cpp