Nasıl yapılır: bir parallel_for_each döngü yazmak
Bu örnek, nasıl kullanılacağını gösterir concurrency::parallel_for_each algoritması asal sayıların sayısını hesaplamak için bir std::array paralel nesnesi.
Örnek
Aşağıdaki örnek, bir dizi asal sayıların sayısı iki kez hesaplar. Örneğin ilk kullanan std::for_each seri olarak sayısını hesaplamak için kullanılan algoritma. Daha sonra örnek kullanır parallel_for_each paralel olarak aynı görevi gerçekleştirmek için bir algoritma. Örnek konsola iki hesaplamaları gerçekleştirmek için gereken zaman da yazdırır.
// 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;
}
Aşağıdaki örnek çıktı dört işlemci olan bir bilgisayar içindir.
serial version:
found 17984 prime numbers
took 6115 ms
parallel version:
found 17984 prime numbers
took 1653 ms
Kod Derleniyor
Kodu derlemek için kopyalayın ve sonra Visual Studio Project'te yapıştırın veya adlı bir dosyaya yapıştırın paralel sayısı primes.cpp ve Visual Studio komut istemi penceresinde aşağıdaki komutu çalıştırın.
cl.exe /EHsc parallel-count-primes.cpp
Güçlü Programlama
Örnek geçirir lambda ifade parallel_for_each algoritmasını kullanır InterlockedIncrement döngü sayacı aynı anda artırmak için paralel yinelemelerini etkinleştirmek için işlevi. İşlevlerini kullanırsanız InterlockedIncrement paylaşılan kaynaklara erişimi eşitlemek için kodunuzda performans sunabilirsiniz. Örneğin bir kilidi serbest eşitleme mekanizması kullanabilirsiniz, concurrency::combinable sınıfı, paylaşılan kaynaklara erişimi eşzamanlı ortadan kaldırmak için. Kullanan bir örnek için combinable bu şekilde sınıf için bkz: Nasıl yapılır: performansı artırmak için combinable kullan.