Aracılığıyla paylaş


Nasıl yapılır: eşzamanlılık çalışma zamanı kullanılacak azaltma değişken kullanan bir OpenMP döngüye dönüştürür

Bu örnek bir OpenMP dönüştürmek nasıl gösterir paraleliçin kullanan bir döngü azaltma eşzamanlılık çalışma zamanı kullanmak için yan tümcesi.

OpenMP reduction yan tümcesi azaltma işlemi sonunda paralel bölge, konu bir veya birden çok iş parçacığı özel değişkenleri belirlemenize olanak sağlar.OpenMP azaltma işleçleri kümesini önceden belirler.Bir skalar her azaltma değişken olmalıdır (örneğin, int, long, ve float).OpenMP ayrıca çeşitli kısıtlamalar azaltma değişkenlerin paralel bir bölgede nasıl kullanıldığını tanımlar.

Paralel desen kitaplığı (ppl) sağlayan concurrency::combinable belirtilecek hesaplamaları gerçekleştirmek ve sonra bu hesaplamaların sonucunu birleştirme sağlar yeniden kullanılabilir, iş parçacığı yerel depolama sağlayan sınıf.combinable Skalar ve karmaşık türleri üzerinde etkili bir şablon bir sınıftır.Kullanmak için combinable sınıfı, sub-computations paralel bir yapı gövdesinde gerçekleştirmek ve sonra call concurrency::combinable::combine veya concurrency::combinable::combine_each nihai sonucu üretmek için yöntem.combine Ve combine_each ele yöntemlerinin her bir işlevi bir araya öğelerinin her çifti birleştirmek nasıl belirtir.Bu nedenle, combinable sınıf azaltma işleçleri sabit bir dizi sınırlı değildir.

Örnek

Bu örnek, OpenMP hem de eşzamanlılık çalışma zamanı ilk 35 Fibonacci sayıların toplamını hesaplamak için kullanır.

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

Bu örnek aşağıdaki çıktıyı üretir.

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 sınıfı hakkında daha fazla bilgi için, bkz. Paralel kapsayıcıları ve nesneleri.

Kod Derleniyor

Örnek kodu kopyalayın ve Visual Studio Project'te yapıştırın veya adlı bir dosyaya yapıştırın concrt omp fibonacci reduction.cpp ve Visual Studio komut istemi penceresinde aşağıdaki komutu çalıştırın.

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

Ayrıca bkz.

Kavramlar

Eşzamanlılık çalýþma OpenMP ' geçiş

Paralel kapsayıcıları ve nesneleri