Политики параллельного выполнения в C ++ 17 - PullRequest
0 голосов
/ 02 ноября 2018

Я недавно начал использовать / изучать некоторые новые возможности C ++ 17 для достижения параллелизма.

Я следовал коду (указанному ниже), более или менее адаптированному из поваренной книги C ++ 17 (https://www.oreilly.com/library/view/c17-stl-cookbook/9781787120495/).

Но независимо от того, использую ли я 'execute :: par' или 'execute :: seq', кажется, что нет разницы во времени выполнения (см. Вывод ниже).

--- --- код

#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
#include <execution>
#include <ctime>

using namespace std;

static bool odd(int n) { return ((n % 2)==0); }

int main(int argc, char** argv)
{
    int arg1 = -1;
    if (argc == 2)
    {
        arg1 = atoi(argv[1]);
    }
    std::time_t result1 = std::time(nullptr);

    vector<int> d(50000000);

    mt19937 gen;
    uniform_int_distribution<int> dis(0, 100000);
    auto rand_num([=]() mutable { return dis(gen); });

    if (arg1 == 1)
    {
        generate(execution::par, begin(d), end(d), rand_num);

        auto odds(count_if(execution::par, begin(d), end(d), odd));
        cout << (100.0 * odds / d.size()) << "% of the numbers are odd.\n";
    }
    else if(arg1 == 2)
    {
        generate(execution::seq, begin(d), end(d), rand_num);

        auto odds(count_if(execution::seq, begin(d), end(d), odd));
        cout << (100.0 * odds / d.size()) << "% of the numbers are odd.\n";
    }   
    else
    {
        cout << "Missing argument..";
    }
    std::time_t result2 = std::time(nullptr);
    std::cout << "\t\n" << result2-result1 << " (seconds)\n";
}

Я использую Visual Studio 2017 ver 15.8.8. Вот некоторые из параметров компиляции / сборки:

/ JMC / GS / Qpar / W3 / Zc: wchar_t / ZI / Gm- / Od / Zc: inline / fp: точный / D "_DEBUG" / D "_UNICODE" / D "UNICODE" / errorReport : подсказка / WX- / Zc: forScope / RTC1 / Gd / MDd / std: c ++ последняя / FC / EHsc / nologo / диагностика: классическая

---- на выходе я получаю ----

> stlpar.exe 1

49,9995% чисел нечетные.

16 (секунд)

> stlpar.exe 2

49,9995% чисел нечетные.

16 (секунд)

>

Я ожидаю, что при запуске с аргументом 1 следует использовать execute :: par, и время должно быть заметно меньше по сравнению с запуском с аргументом 2, который переключается на 'execute :: seq'.

1 Ответ

0 голосов
/ 02 ноября 2018

В VS 15.8 generate не реализовано как параллельная функция . Таким образом, если время для кода определяется функцией generate, во время выполнения вашего примера кода не будет существенной разницы.

Также рекомендуется использовать таймер высокого разрешения:

#include <chrono>
using std::chrono::high_resolution_clock;
...