Cara: Menulis Perulangan parallel_for_each
Contoh ini menunjukkan cara menggunakan concurrency::parallel_for_each
algoritma untuk menghitung jumlah bilangan prima dalam std::array
objek secara paralel.
Contoh
Contoh berikut menghitung jumlah bilangan prima dalam array dua kali. Contoh pertama-tama std::for_each
menggunakan algoritma untuk menghitung hitungan secara serial. Contoh kemudian menggunakan parallel_for_each
algoritma untuk melakukan tugas yang sama secara paralel. Contohnya juga mencetak ke konsol waktu yang diperlukan untuk melakukan kedua komputasi.
// 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;
// Returns the number of milliseconds that it takes to call the passed in function.
template <class Function>
__int64 time_call(Function&& f)
{
__int64 begin = GetTickCount();
f();
return GetTickCount() - begin;
}
// Determines whether the input is a prime.
bool is_prime(int n)
{
if (n < 2)
{
return false;
}
for (int i = 2; i < int(std::sqrt(n)) + 1; ++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++;
});
// Use the for_each algorithm to count, serially, the number
// of prime numbers in the array.
LONG prime_count = 0L;
__int64 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, in parallel, the number
// of prime numbers in the array.
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;
}
Contoh output berikut adalah untuk komputer yang memiliki empat inti.
serial version:
found 17984 prime numbers
took 125 ms
parallel version:
found 17984 prime numbers
took 63 ms
Mengompilasi Kode
Untuk mengkompilasi kode, salin lalu tempelkan dalam proyek Visual Studio, atau tempelkan dalam file yang diberi nama parallel-count-primes.cpp
lalu jalankan perintah berikut di jendela Prompt Perintah Visual Studio.
cl.exe /EHsc parallel-count-primes.cpp
Pemrograman yang Kuat
Ekspresi lambda yang diteruskan contoh ke parallel_for_each
algoritma menggunakan InterlockedIncrement
fungsi untuk mengaktifkan iterasi paralel dari perulangan untuk menaikkan penghitung secara bersamaan. Jika Anda menggunakan fungsi seperti InterlockedIncrement
untuk menyinkronkan akses ke sumber daya bersama, Anda dapat menyajikan hambatan performa dalam kode Anda. Anda dapat menggunakan mekanisme sinkronisasi bebas kunci, misalnya, concurrency::combinable
kelas , untuk menghilangkan akses simultan ke sumber daya bersama. Untuk contoh yang menggunakan kelas dengan combinable
cara ini, lihat Cara: Menggunakan yang dapat dikombinasikan untuk meningkatkan performa.