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.

Baca juga

Algoritma paralel
parallel_for_each Fungsi