Aracılığıyla paylaş


Nasıl yapılır: Eşzamanlılık Çalışma Zamanı Kullanmak için Azaltma Değişkeni Kullanan bir OpenMP Döngüsünü Dönüştürme

Bu örnekte, Eşzamanlılık Çalışma Zamanı'nı kullanmak için azaltma yan tümcesini kullanan bir OpenMP paraleldöngüsünün nasıl dönüştürüldüğü gösterilmektedir.

OpenMP reduction yan tümcesi, paralel bölgenin sonunda azaltma işlemine tabi olan bir veya daha fazla iş parçacığı özel değişkeni belirtmenize olanak tanır. OpenMP, bir azaltma işleçleri kümesini önceden belirler. Her azaltma değişkeni bir skaler olmalıdır (örneğin, int, longve float). OpenMP, azaltma değişkenlerinin paralel bölgede nasıl kullanıldığına ilişkin çeşitli kısıtlamaları da tanımlar.

Paralel Desenler Kitaplığı (PPL), ayrıntılı hesaplamalar yapmanıza ve ardından bu hesaplamaları nihai bir sonuçla birleştirmenize olanak tanıyan yeniden kullanılabilir, iş parçacığı yerel depolaması sağlayan eşzamanlılık::combinable sınıfını sağlar. combinable sınıfı, hem skaler hem de karmaşık türler üzerinde hareket eden bir şablondur. sınıfını combinable kullanmak için, paralel bir yapı gövdesinde alt hesaplamalar gerçekleştirin ve ardından nihai sonucu oluşturmak için concurrency::combinable::combine or concurrency::combinable::combine_each yöntemini çağırın. ve combine_each yöntemlerinin combine her biri, her öğe çiftinin nasıl birleştirildiğini belirten bir combine işlevi alır. Bu nedenle, combinable sınıfı sabit bir azaltma işleçleri kümesiyle sınırlı değildir.

Örnek

Bu örnek, ilk 35 Fibonacci numarasının toplamını hesaplamak için hem OpenMP hem de Eşzamanlılık Çalışma Zamanı'nı 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 çıkışı oluşturur.

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.

sınıfı hakkında combinable daha fazla bilgi için bkz . Paralel Kapsayıcılar ve Nesneler.

Kod Derleniyor

Örnek kodu kopyalayıp bir Visual Studio projesine yapıştırın veya adlı concrt-omp-fibonacci-reduction.cpp bir dosyaya yapıştırın ve ardından bir Visual Studio Komut İstemi penceresinde aşağıdaki komutu çalıştırın.

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

Ayrıca bkz.

OpenMP döngüsünden Eşzamanlılık Çalışma Zamanına geçiş
Paralel Kapsayıcılar ve Nesneler