并行化后,简单程序无法正常工作

时间:2013-04-07 10:50:01

标签: c++ openmp

我有一个简单的程序,它生成(使用Boost)一些初始速度和位置,并计算传播一定距离所需的时间。基于横向距离(x, y),将最终轴向(z)速度添加到矢量。这是一个简单的程序:

#include <iostream>
#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>

using namespace std;




int main()
{

    boost::mt19937 engine(static_cast<unsigned int>(time(0)));


    boost::normal_distribution<double> nd(0.0, 1.0);
    boost::variate_generator< boost::mt19937, boost::normal_distribution<double> > normal_std_one(engine, nd);






    double coordX, coordY, coordZ, time;
    double velX, velY, velZ;

    const double factor = 0.01;
    const double distance = 15.0;

    vector<double> cont;

    int i;
    for(i=0; i<1000000000; i++)
    {
        coordX = factor*normal_std_one();
        coordY = factor*normal_std_one();
        coordZ = 0.0;


        velX = normal_std_one();
        velY = normal_std_one();
        velZ = 20.0*normal_std_one()+300;



        time = distance/velZ;

        coordX += velX*time;
        coordY += velY*time;

        if(sqrt(coordX*coordX + coordY*coordY) < 0.02)
        {
            cont.push_back(velZ);
        }
    }
    cout << cont.size() << endl;


    return 0;
}

我认为一个很好的补充是使用for并行化OpenMP - 循环。我这样做是在启动循环之前添加以下行:

#pragma omp parallel for

此外,我已将-fopenmp添加到编译器选项,将`-fopenmp *添加到链接器设置。我的程序编译和链接没有错误,但当我执行文件时,我收到消息:

Process terminated with status -1073741819 (0 minutes, 2 seconds)

我不清楚我在这里做错了什么。我正在使用Windows和g ++(通过Code :: Blocks IDE)。

2 个答案:

答案 0 :(得分:1)

我发布这个作为答案但不评论只是为了积累结果并避免长列表评论。如果您正确处理parallel_for的大小以避免std:vector异常,它可以与Microsoft的PPL中的out-of-range一起使用。但问题是当i超过~20000时,boost::variate_generator无法处理多个请求,导致程序崩溃时出现APPLICATION_FAULT_INVALID_POINTER_READ错误。

更新:在没有boost::variate_generator的情况下使用(简单地为vector的索引指定一个值)它在没有错误的情况下运行但显示的结果与预期相反 - 顺序代码运行得更快多线程与parallel_for

答案 1 :(得分:0)

您不能在多个线程中使用cont.push_back不同步。这不是线程安全的。您将需要使用不同的容器,或在访问时使用某种互斥锁。如果重要的话,您可能还需要做一些事情来保留他们进入容器的顺序。