Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Cara: Menulis Perulangan
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.