Sdílet prostřednictvím


Postupy: Programování smyčky parallel_for_each

Tento příklad ukazuje, jak použít concurrency::parallel_for_each algoritmus k výpočtu počtu prvočísel v std::array objekt současně.

Příklad

Následující příklad vypočítá počet prvočísel v matici dvakrát.V prvním příkladu std::for_each algoritmus k výpočtu počtu sériově.V příkladu se pak používá parallel_for_each algoritmus provádět stejné úlohy paralelně.Příklad také vypisuje na konzoli čas nutný k provedení obou výpočtů.

// parallel-count-primes.cpp 
// compile with: /EHsc
#include <windows.h>
#include <ppl.h>
#include <iostream>
#include <algorithm>
#include <array>

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

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

int wmain()
{
   // Create an array object that contains 200000 integers. 
   array<int, 200000> a;

   // Initialize the array such that a[i] == i. 
   int n = 0;
   generate(begin(a), end(a), [&] {
      return n++;
   });

   LONG prime_count;
   __int64 elapsed;

   // Use the for_each algorithm to count the number of prime numbers 
   // in the array serially.
   prime_count = 0L;
   elapsed = time_call([&] {
      for_each (begin(a), end(a), [&](int n ) { 
         if (is_prime(n))
            ++prime_count;
      });
   });
   wcout << L"serial version: " << endl
         << L"found " << prime_count << L" prime numbers" << endl
         << L"took " << elapsed << L" ms" << endl << endl;

   // Use the parallel_for_each algorithm to count the number of prime numbers 
   // in the array in parallel.
   prime_count = 0L;
   elapsed = time_call([&] {
      parallel_for_each (begin(a), end(a), [&](int n ) { 
         if (is_prime(n))
            InterlockedIncrement(&prime_count);
      });
   });
   wcout << L"parallel version: " << endl
         << L"found " << prime_count << L" prime numbers" << endl
         << L"took " << elapsed << L" ms" << endl << endl;
}

Následující ukázkový výpis je pro počítač se čtyřmi procesory.

  

Probíhá kompilace kódu

Kompilovat kód, zkopírujte jej a vložte do projektu sady Visual Studio nebo vložit do souboru s názvem paralelní počet primes.cpp a potom spusťte následující příkaz v okně Příkazový řádek Visual Studio.

cl.exe /EHsc parallel-count-primes.cpp

Robustní programování

Lambda výraz, který v příkladu předá parallel_for_each algoritmus používá InterlockedIncrement funkce Povolit paralelní iterací smyčky čítač současně přibývá.Jestliže pomocí funkcí, jako InterlockedIncrement pro synchronizaci přístupu ke sdíleným prostředkům, mohou představovat výkon, problémová místa ve vašem kódu.Mechanismus uvolnění zámku synchronizace, můžete použít například, concurrency::combinable třídy vyloučit současný přístup ke sdíleným prostředkům.Pro příklad, který používá combinable třídy tímto způsobem naleznete v tématu Postupy: Použití objektu combinable ke zlepšení výkonu.

Viz také

Referenční dokumentace

parallel_for_each – funkce

Koncepty

Paralelní algoritmy