gpt4 book ai didi

c++ - 使用并行编程 C++ 计算/访问 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:00 26 4
gpt4 key购买 nike

我有一个矩阵:

std::vector<std::vector<double> >* p_mat_cache = 
new std::vector<std::vector<double> >(3, std::vector<double>());

和一个 vector :

std::vector<double>* p_val_vec_1 = new std::vector<double>(*mpStages);

其中“mpStages”是一个整数值。在某一时刻,我应用了一个发生以下情况的函数:

pMatCache->at(1).push_back((*pValVec1)[j+1]);
pMatCache->at(2).push_back((*pValVec1)[j]);

(*pValVec2)[j] = fmax(*mpK - CalculateS(i, j), *mpD *(0.5 * (*pValVec1)[j+1] +
0.5*(*pValVec1)[j]));

pMatCache->at(0).push_back((*pValVec2)[j]);

pValVec1 和 pMatCache 对应本地名称。 pValVec2 是另一个长度为“mpStages-1”的 vector 。 'CalculateS' 如下:

double AbstractOptionSolver::CalculateS(int n, int i)
{
return pow(*mpUp,i) * pow(*mpDown, n-i) * *mpS;
}

其中私有(private)变量“*mpS”、“*mpUp”和“*mpDown”在代码执行期间不会改变。我想做的是并行运行其中的一部分,我认为可以按以下方式完成:

#pragma omp parallel
{
pMatCache->at(1).push_back((*pValVec1)[j+1]);
pMatCache->at(2).push_back((*pValVec1)[j]);

(*pValVec2)[j] = fmax(*mpK - CalculateS(i, j), *mpD *(0.5 * (*pValVec1)[j+1] +
0.5*(*pValVec1)[j]));
}

pMatCache->at(0).push_back((*pValVec2)[j]);

但是,由于添加了“omp parallel”,即使我只有 omp parallel(仅包括推回),此代码仍会崩溃。想知道是否有人知道为什么会这样?

我也在尝试进一步了解并行编程,以了解何时/何时我不能在一个函数中/在一个函数中使用它,因为有时使某些方面并行会导致此代码因未知原因崩溃。如果有人有任何资源可以帮助我解决这个问题,那就太好了。

最佳答案

首先,#pragma omp parallel 只会在此时生成一堆线程,它们将在作用域部分执行完全相同的操作,它不会为每个线程分配唯一的 j 或 i。你可能想看看 http://bisqwit.iki.fi/story/howto/openmp/#ParallelismConditionalityClauseIf查看如何基于索引进行并行化。但是鉴于代码片段,很难准确地说出您想要做什么。

下一个最大的问题是您将有多个线程同时调用 .push_back。您需要预分配和分配值。

我不确定您为什么对 std::vector 使用指针和新语法。通常将 vector 与 RAII 结合使用,避免调用 new/delete。

关于c++ - 使用并行编程 C++ 计算/访问 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40682519/

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