gpt4 book ai didi

c++ - 简单程序在并行化后不工作

转载 作者:行者123 更新时间:2023-11-28 07:41:04 25 4
gpt4 key购买 nike

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

#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 循环。为此,我在循环开始之前添加了以下行:

#pragma omp parallel for

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

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

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

最佳答案

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

更新:在没有boost::variate_generator(简单地为 vector 的索引赋值)的情况下在双核笔记本上使用时,它运行没有错误,但显示的结果与预期 - 顺序代码比使用 parallel_for 的多线程运行得更快。

关于c++ - 简单程序在并行化后不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15861536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com