gil*_*esc 6 c++ multithreading openmp
我发现自己经常编写以下形式的C++代码:
while (getline(strm, line)) {
cout << computationally_intensive_function(line) << endl;
}
Run Code Online (Sandbox Code Playgroud)
我想并行化这段代码.到目前为止,我提出的最佳解决方案是构建字符串向量以容纳大量(10000-100000)行数,然后在此向量上并行化
#pragma omp parallel for
Run Code Online (Sandbox Code Playgroud)
然后清空矢量并在线条保留时重复.但是,此方法需要大量内存,而其他内核处于空闲状态,而主进程则缓冲字符串.有没有更好的办法?像Python multiprocessing.Pool.map或Hadoop之类的东西?(我想避免使用Hadoop的C++ API,因为Hadoop相当重量级,可能无法在我的代码运行的任何地方安装.)
存在OpenMP 3.0 任务的众所周知的特性,这是非常不幸的,因为它们是专门为覆盖这样的情况而创建的.如果您的编译器支持该标准版本,那么您一定要选择OpenMP任务.但请记住,从多个线程写入stdout(或std::cout)通常会严重混合其输出,并且您很可能希望在其上进行同步:
#pragma omp parallel
{
#pragma omp master
while (getline(strm, line))
#pragma omp task
{
result_type result = computationally_intensive_function(line);
#pragma omp critical
{
cout << result << endl;
cout.flush();
}
}
#pragma omp taskwait
}
Run Code Online (Sandbox Code Playgroud)
我让你自己决定应该变量shared和应该是什么private.