Aracılığıyla paylaş


Paralel Desenler kitaplığının (ppl)

Paralel desen kitaplığı (ppl), ölçeklenebilirlik ve kolaylığı eş zamanlı uygulamalar geliştirmek için kullanım yükseltir zararlara bir programlama modeli sağlar. Planlama ve kaynak yönetimi bileşenlerini eşzamanlılık zamanının üzerinde ppl oluşturur. Genel, tür-güvenli algoritmalar ve davranmasını kapsayıcıları paralel veri sağlayarak uygulama kodunu temel iş parçacığı mekanizması arasındaki soyutlama düzeyini yükseltir. ppl ölçeklemek yerine paylaşılan durum sağlayarak uygulamaları geliştirmek sağlar.

ppl aşağıdaki özellikleri sağlar:

  • Görev paralellik: paralel olarak birçok çalışma öğelerini (görevler) yürütmek için bir mekanizma

  • Paralel algoritmalar: Koleksiyonlar paralel veri üzerinde işlem yapılacak genel algoritmaları

  • Paralel kapsayıcıları ve nesneleri: öğelerini eşzamanlı güvenli erişim sağlayan genel bir kap türleri

Örnek

ppl standart şablon kitaplığı (stl) benzer bir programlama modeli sağlar. ppl özelliklerinin çoğu aşağıdaki örnekte gösterilmiştir. Birkaç Fibonacci sayıları paralel ve seri olarak hesaplar. Her iki hesaplamaları işlevi görecek bir std::array nesnesi. Örnek konsola iki hesaplamaları gerçekleştirmek için gereken zaman da yazdırır.

stl seri sürümünü kullanır std::for_each dizi Gez algoritmasını ve sonuçları depolayan bir std::vector nesnesi. Paralel sürümü aynı görevi gerçekleştirir, ancak ppl kullanan concurrency::parallel_for_each algoritması ve sonuçları depolayan bir concurrency::concurrent_vector nesne. concurrent_vector Aynı anda kapsayıcısına yazma erişimi eşitlemek için zorunluluğu olmadan öğeleri eklemek, her döngü tekrarında sınıfı sağlar.

Çünkü parallel_for_each davranır gerekir aynı anda, bu örneğin paralel sürüm sıralama concurrent_vector nesnesinin seri sürümü ile aynı sonucu verir.

Not örnek Fibonacci sayıları hesaplamak için bir naïve yöntemini kullanır; Ancak, bu yöntemi eşzamanlılık çalışma zamanı uzun hesaplamaları performansını nasıl artırabilir göstermektedir.

// parallel-fibonacci.cpp
// compile with: /EHsc
#include <windows.h>
#include <ppl.h>
#include <concurrent_vector.h>
#include <array>
#include <vector>
#include <tuple>
#include <algorithm>
#include <iostream>

using namespace concurrency;
using namespace std;

// Calls the provided work function and returns the number of milliseconds 
// that it takes to call that function.
template <class Function>
__int64 time_call(Function&& f)
{
   __int64 begin = GetTickCount();
   f();
   return GetTickCount() - begin;
}

// Computes the nth Fibonacci number.
int fibonacci(int n)
{
   if(n < 2)
      return n;
   return fibonacci(n-1) + fibonacci(n-2);
}

int wmain()
{
   __int64 elapsed;

   // An array of Fibonacci numbers to compute.
   array<int, 4> a = { 24, 26, 41, 42 };

   // The results of the serial computation.
   vector<tuple<int,int>> results1;

   // The results of the parallel computation.
   concurrent_vector<tuple<int,int>> results2;

   // Use the for_each algorithm to compute the results serially.
   elapsed = time_call([&] 
   {
      for_each (begin(a), end(a), [&](int n) {
         results1.push_back(make_tuple(n, fibonacci(n)));
      });
   });   
   wcout << L"serial time: " << elapsed << L" ms" << endl;

   // Use the parallel_for_each algorithm to perform the same task.
   elapsed = time_call([&] 
   {
      parallel_for_each (begin(a), end(a), [&](int n) {
         results2.push_back(make_tuple(n, fibonacci(n)));
      });

      // Because parallel_for_each acts concurrently, the results do not 
      // have a pre-determined order. Sort the concurrent_vector object
      // so that the results match the serial version.
      sort(begin(results2), end(results2));
   });   
   wcout << L"parallel time: " << elapsed << L" ms" << endl << endl;

   // Print the results.
   for_each (begin(results2), end(results2), [](tuple<int,int>& pair) {
      wcout << L"fib(" << get<0>(pair) << L"): " << get<1>(pair) << endl;
   });
}

Aşağıdaki örnek çıktı dört işlemci olan bir bilgisayar içindir.

serial time: 9250 ms
parallel time: 5726 ms

fib(24): 46368
fib(26): 121393
fib(41): 165580141
fib(42): 267914296

Her döngü tamamlamak için farklı bir süre gerektirir. Performansı parallel_for_each tamamlandığında son işlem sınırlıdır. Bu nedenle, bu örnek seri ve paralel sürümleri arasındaki doğrusal performans iyileştirmeleri beklememelisiniz.

İlgili Konular

Başlık

Description

Görev paralellik (eşzamanlılık çalışma zamanı)

Görevler ve Görev grupları ppl açıklar.

Paralel algoritmalar

Paralel algoritmalar gibi kullanmayı açıklar parallel_for ve parallel_for_each.

Paralel kapsayıcıları ve nesneleri

Çeşitli paralel kapsayıcılar ve ppl tarafından sağlanan nesneleri açıklar.

ppl iptali

Paralel algoritması tarafından gerçekleştirilen iş iptal açıklar.

Eşzamanlılık çalışma zamanı

Paralel programlama basitleştirir ve ilgili konuların bağlantılarını içeren eşzamanlılık çalışma açıklar.