C++17中的并行执行策略
Parallel execution policies in C++ 17
我最近开始使用/学习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 << "tn" << 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"/错误报告:提示/WX-/Zc:forScope/RTC1/Gd/MDd/std:c++最新/FC/EHsc/nologo/defaults:classic
----我得到的输出----
>stlpar.exe 1
49.9995%的数字是奇数。
16(秒(
>stlpar.exe 2
49.9995%的数字是奇数。
16(秒(
>
我希望使用参数1运行时应该使用execution::par,并且与使用切换到"execution::seq"的参数2运行时相比,时间应该明显更短。
在VS 15.8中,generate
不是作为并行函数实现的。因此,如果代码的时间由generate
函数支配,那么示例代码的执行时间将不会有显著差异。
此外,使用高分辨率计时器也是一种很好的做法:
#include <chrono>
using std::chrono::high_resolution_clock;
相关文章:
- C++17中的并行执行策略
- 在 Radeon 卡上并行执行多个 OpenCL 内核
- 使用 OpenMP 并行执行比串行执行 c++ 花费更长的时间,我计算执行时间是否正确?
- 用于 std::generate_n 的并行执行可变 lambda 生成器
- 选择零件的策略要执行C
- 在 C++Amp 中并行执行的几种算术运算
- 为什么并行执行Tcl_ExprDouble的独立Tcl解释器需要互斥
- QThread:使用 GUI 反馈阻止进行并行执行
- CUDA - 了解线程的并行执行(扭曲)和合并的内存访问
- 下面的代码是否运行两个子进程,从 C++ 中的单个父进程并行执行
- 提升io_service非阻塞并行执行
- 并行执行的 OpenCL 验证
- 并行执行不更新我的变量
- 使用pthread_cond_broadcast并行执行
- MPI策略-并行化成一个函数- MPI_Gather
- boost::asio库的async_*函数是否由操作系统并行执行?
- 在c++中,包含后增量的表达式能否与该表达式的其他部分并行执行?
- 递归深度切断策略:并行快速排序
- 并行执行比顺序执行快的示例
- 并行执行比串行执行花费更多的时间