Aracılığıyla paylaş


Nasıl yapılır: bir OpenMP paralel eşzamanlılık çalışma zamanı kullanmak döngü için dönüştürme

Bu örnek nasıl dönüştürüleceği OpenMP kullanan bir döngü gösterir paralel ve için eşzamanlılık çalışma zamanı kullanma yönergeleri concurrency::parallel_for algoritması.

Örnek

Bu örnek, OpenMP hem de çalışma zamanı eşzamanlılık asal sayıların rasgele değerler dizisi sayısını hesaplamak için kullanır.

// concrt-omp-count-primes.cpp
// compile with: /EHsc /openmp
#include <ppl.h>
#include <random>
#include <array>
#include <iostream>

using namespace concurrency;
using namespace std;

// Determines whether the input value is prime.
bool is_prime(int n)
{
   if (n < 2)
      return false;
   for (int i = 2; i < n; ++i)
   {
      if ((n % i) == 0)
         return false;
   }
   return true;
}

// Uses OpenMP to compute the count of prime numbers in an array.
void omp_count_primes(int* a, size_t size)
{
   if (size == 0)
      return;

   size_t count = 0;
   #pragma omp parallel for
      for (int i = 0; i < static_cast<int>(size); ++i)
      {
         if (is_prime(a[i])) {
            #pragma omp atomic
               ++count;
         }
      }

   wcout << L"found " << count 
         << L" prime numbers." << endl;
}

// Uses the Concurrency Runtime to compute the count of prime numbers in an array.
void concrt_count_primes(int* a, size_t size)
{
   if (size == 0)
      return;

   combinable<size_t> counts;
   parallel_for<size_t>(0, size, [&](size_t i) 
   {
      if (is_prime(a[i])) {
         counts.local()++;
      }
   });

   wcout << L"found " << counts.combine(plus<size_t>()) 
         << L" prime numbers." << endl;
}

int wmain()
{
   // The length of the array.
   const size_t size = 1000000;

   // Create an array and initialize it with random values.
   int* a = new int[size];

   mt19937 gen(42);
   for (size_t i = 0; i < size; ++i) {
      a[i] = gen();
   }

   // Count prime numbers by using OpenMP and the Concurrency Runtime.

   wcout << L"Using OpenMP..." << endl;
   omp_count_primes(a, size);

   wcout << L"Using the Concurrency Runtime..." << endl;
   concrt_count_primes(a, size);

   delete[] a;
}

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

Using OpenMP...
found 107254 prime numbers.
Using the Concurrency Runtime...
found 107254 prime numbers.

parallel_for Algoritması ve OpenMP 3.0 izin dizin türü imzalı tamsayı türü veya imzalanmamış tamsayı türü olmalıdır.parallel_for Algoritması da yaptığı belirtilen aralık imzalanmış türü taşması değil emin.OpenMP sürüm 2.0 ve 2.5 imzalı tamsayı dizin türleri için izin verir.OpenMP dizin aralığı da doğrulamaz.

Eşzamanlılık çalışma zamanı kullanır Bu örnek sürümü de kullanan bir concurrency::combinable yerine nesne Atomik yönergesi eşitleme gerektirmeden sayaç değeri artırmak için.

Hakkında daha fazla bilgi için parallel_for ve diğer paralel algoritmalar, bkz: Paralel algoritmalar.combinable sınıfı hakkında daha fazla bilgi için, bkz. Paralel kapsayıcıları ve nesneleri.

Bu örnek üzerinde işlem yapılacak öncekinin değiştiren bir std::array doğal bir dizi nesne yerine.OpenMP sürüm 2.0 ve 2.5 için tam dizin türleri yalnızca imzalı izin nedeniyle bir parallelfor yapı, paralel standart şablon kitaplığı (stl) kapsayıcı öğeler erişmek için Yineleyicilerde kullanamazsınız.Paralel desen kitaplığı (ppl) sağlayan concurrency::parallel_for_each paralel, yinelemeli bir kapsayıcı stl tarafından sağlanan gibi görevleri gerçekleştirir algoritması.Aynı bölümleme mantığı kullanır, parallel_for algoritmasını kullanır.parallel_for_each Algoritma benzer stl std::for_each dışında algoritma parallel_for_each algoritması görevleri aynı anda yürütür.

// Uses OpenMP to compute the count of prime numbers in an 
// array object.
template<size_t Size>
void omp_count_primes(const array<int, Size>& a)
{
   if (a.size() == 0)
      return;

   size_t count = 0;
   int size = static_cast<int>(a.size());
   #pragma omp parallel for
      for (int i = 0; i < size; ++i)
      {
         if (is_prime(a[i])) {
            #pragma omp atomic
               ++count;
         }
      }

   wcout << L"found " << count 
         << L" prime numbers." << endl;
}

// Uses the Concurrency Runtime to compute the count of prime numbers in an 
// array object.
template<size_t Size>
void concrt_count_primes(const array<int, Size>& a)
{
   if (a.size() == 0)
      return;

   combinable<size_t> counts;
   parallel_for_each(begin(a), end(a), [&counts](int n) 
   {
      if (is_prime(n)) {
         counts.local()++;
      }
   });

   wcout << L"found " << counts.combine(plus<size_t>()) 
         << L" prime numbers." << endl;
}

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 sayısı primes.cpp ve Visual Studio komut istemi penceresinde aşağıdaki komutu çalıştırın.

cl.exe /EHsc /openmp concrt-omp-count-primes.cpp

Ayrıca bkz.

Kavramlar

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

Paralel algoritmalar

Paralel kapsayıcıları ve nesneleri