Compartilhar via


Como: Converter um Loop do OpenMP usa uma variável de redução para usar o Runtime de simultaneidade

Este exemplo demonstra como converter um OpenMP paralela para loop que usa o reduction cláusula para usar o Runtime de simultaneidade.

O OpenMP reduction permite cláusula que você especificar uma ou mais variáveis de segmento particular que estão sujeitos a uma operação de redução no final da região paralela. OpenMP predefine a um conjunto de operadores de redução. Cada variável de redução deve ser um escalar (por exemplo, int, long, e float). O OpenMP também define várias restrições sobre como as variáveis de redução são usadas em uma região paralela.

O paralela padrões PPL (biblioteca) fornece a Concurrency::combinable classe, que fornece armazenamento reutilizável, local de segmento que lhe permite realizar cálculos refinados e mesclar essas computações um resultado final. O combinable classe é um modelo que age em tipos escalares e complexos. Para usar o combinable classe, execute sub-computations no corpo de uma construção em paralelo e em seguida, chame o Concurrency::combinable::combine ou Concurrency::combinable::combine_each método para produzir o resultado final. O combine e combine_each os métodos de tirar uma combinar a função que especifica como combinar cada par de elementos. Portanto, o combinable classe é não restrito a um conjunto fixo de operadores de redução.

Exemplo

Este exemplo usa o OpenMP e o Runtime de simultaneidade para calcular a soma dos números de Fibonacci de 35 primeiro.

// 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);
}

O exemplo produz a seguinte saída.

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.

For more information about the combinable class, see Paralelo recipientes e objetos.

Compilando o código

Copie o código de exemplo e colá-lo em um Visual Studio do projeto, ou colá-lo em um arquivo que é chamado concrt-omp fibonacci reduction.cpp e, em seguida, execute o seguinte comando um Visual Studio 2010 janela do Prompt de comando.

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

Consulte também

Conceitos

Paralelo recipientes e objetos

Outros recursos

Migrando do OpenMP para o Runtime de simultaneidade