我有一個簡單的程序,它生成(使用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;
}
我想到了一個很好的補充將使用OpenMP
並行化for
-loop。這是我做的,加入循環開始之前以下行:
#pragma omp parallel for
另外,我已經加入到-fopenmp
編譯器選項和`-fopenmp *的鏈接器設置。我的程序編譯並沒有錯誤鏈接,但是當我執行這個文件我得到的消息:
Process terminated with status -1073741819 (0 minutes, 2 seconds)
我做了什麼錯在這裏是我不清楚。我使用Windows和g ++(通過Code :: Blocks IDE)。
您有多個線程正在同時嘗試更新「cont」狀態... – 2013-04-07 10:52:15
@OliCharlesworth因此,如果使用向量,那麼使用OpenMP是不可能的? – BillyJean 2013-04-07 10:54:05
如果將它替換爲cont.push_back [i] = velZ,它會有什麼區別嗎? ? – SChepurin 2013-04-07 11:17:18