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を使用して -loop を並列化するのが良い追加だと思いました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

これを回答として投稿しますが、結果を蓄積し、コメントの長いリストを避けるためだけにコメントするのではありません。のサイズを適切に処理して例外を回避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 に答える