Udostępnij za pośrednictwem


Biblioteka równoległych wzorców (PLL)

Równoległe Biblioteka wzorców (PPL) udostępnia nadrzędnych modelu programowania, która sprzyja skalowalność i łatwość użycia umożliwiający projektowanie aplikacji równoczesnych.PPL jest tworzony na planowanie i składników zarządzania środowiska wykonawczego współbieżności.Uruchamia poziom abstrakcję między kodu aplikacji i mechanizmu wątków źródłowego podając algorytmy ogólny, bezpieczne i kontenerów, które działają na danych równolegle.PPL umożliwia także projektować aplikacje łączące dostarczając alternatywy dla udostępnionego stanu.

task — Klasa i powiązanych typów, które są definiowane w ppltasks.h można przenosić na platformach.Równoległe algorytmów i kontenerów nie są przenośnych.

PPL zapewnia następujące funkcje:

  • Równoległość zadań: mechanizm do wykonania równolegle kilka elementów roboczych (zadania)

  • Równoległe algorytmów: ogólny algorytmów, które działają w kolekcji danych równolegle

  • Równoległe kontenerów i obiektów: typy ogólnego kontenera, które umożliwiają bezpieczne równoczesnych dostęp do swoich elementów

Przykład

PPL udostępnia model programowania podobny standardowe biblioteki szablonu (STL).Poniższy przykład przedstawia wiele funkcji PPL.Kilka numerów Fibonacci go oblicza sposób, a jednocześnie.Oba obliczeń, działając w std::array obiektu.Przykład drukowane do konsoli również czas wymagany do wykonywania obliczeń obu.

Wersja seryjny używa STL std::for_each algorytm przechodzenia do tablicy i przechowuje wyniki w std::vector obiektu.Wersja równoległe wykonuje to samo zadanie, ale używa PPL concurrency::parallel_for_each algorytm i przechowuje wyniki w concurrency::concurrent_vector obiektu.concurrent_vector Klasa umożliwia każdej iteracji pętli jednocześnie dodawać elementy nie wymaga, aby zsynchronizować do zapisu w kontenerze.

Ponieważ parallel_for_each działania jednocześnie, równoległe wersji w tym przykładzie należy sortować concurrent_vector obiekt do działają tak samo jak wersja seryjny.

Należy zauważyć, że w przykładzie użyto metody prostym do obliczenia numery Fibonacci; Jednak ta metoda pokazuje, jak środowisko uruchomieniowe współbieżności można zwiększyć wydajność obliczeń długi.

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

Następujące przykładowe dane wyjściowe jest na komputerze, na którym ma cztery procesory.

  

Każdej iteracji pętli wymaga różnych ilość czasu, aby zakończyć.Wydajność parallel_for_each jest ograniczone przez operację, która kończy ostatniej.W związku z tym nie powinien oczekiwać usprawnień wydajności liniowo pomiędzy wersjami seryjny i równoległe w tym przykładzie.

Tematy pokrewne

Tytuł

Opis

Równoległość zadania (współbieżność środowiska wykonawczego)

Opisuje rolę zadań i grup zadań w PPL.

Algorytmy równoległe

Opisuje sposób użycia algorytmów równoległe, takich jak parallel_for i parallel_for_each.

Równoległe kontenery oraz obiekty

Opisuje różne równoległe kontenerów i obiektów, które są udostępniane przez PPL.

Anulowanie w PPL

Jak anulować pracę, którą jest wykonywana przez równoległe algorytmu.

Współbieżność środowiska wykonawczego

Opisuje środowisko uruchomieniowe współbieżności, które upraszczają Programowanie równoległe i zawiera łącza do tematów pokrewnych.