我最近开始使用/学习C ++ 17的一些新功能来实现并行性。
我或多或少地遵循了C ++ 17食谱(https://www.oreilly.com/library/view/c17-stl-cookbook/9781787120495/)中的代码(如下所列)。
但是无论我使用'execution :: par'还是'execution :: 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版本15.8.8。一些编译/构建选项如下:
/ JMC / GS / Qpar / W3 / Zc:wchar_t / ZI / Gm- / Od / Zc:inline / fp:precise / D“ _DEBUG” / D“ _UNICODE” / D“ UNICODE” / errorReport :提示/ WX- / Zc:forScope / RTC1 / Gd / MDd / std:c ++最新/ FC / EHsc / nologo / diagnostics:classic
----我得到的输出----
> stlpar.exe 1
49.9995%的数字是奇数。
16(秒)
> stlpar.exe 2
49.9995%的数字是奇数。
16(秒)
>
我希望与参数2切换到'execution :: seq'的时间相比,与参数1一起运行的时间应该显着减少。
答案 0 :(得分:2)
在VS 15.8中,generate
是not implemented as a parallel function。因此,如果代码的时间由generate
函数控制,则示例代码的执行时间不会有显着差异。
此外,使用高分辨率计时器也是一种好习惯:
#include <chrono>
using std::chrono::high_resolution_clock;