Я недавно начал использовать / изучать некоторые новые возможности 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'.