0

我有一个简单的程序,它生成(使用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)。

4

2 回答 2

1

我将其发布为答案,但不发表评论只是为了积累结果并避免长长的评论列表。如果您正确处理 's 的大小以避免异常,它适用parallel_for于 Microsoft 的 PPL 。但问题是当超过 ~20000 时,无法处理多个请求,导致程序崩溃产生错误。std:vectorout-of-rangeiboost::variate_generatorAPPLICATION_FAULT_INVALID_POINTER_READ

更新:boost::variate_generator在双核笔记本上不使用(简单地为向量的索引分配一个值)时,它运行没有错误,但显示的结果与预期相反 - 顺序代码比多线程运行更快parallel_for

于 2013-04-07T15:22:57.787 回答
0

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

于 2013-04-07T10:56:11.860 回答