我有一个矩阵:
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/