在C++中跨文件行并行化函数的惯用方法

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相当重量级,可能无法在我的代码运行的任何地方安装.)

Hri*_*iev 5

存在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.