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

标签 c++ matrix vector parallel-processing

我有一个矩阵:

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/

相关文章:

c++ - 在 Linux C++ 中获取 PTY 的最简单方法

c++ - 相当于 BlackBerry-10 的 NSClassFromString

r - 将多个 bool 列转换为单个因子列

matrix - 实现注意力池网络问答的问题

c++ - 有没有办法#if Objective-C++?

c++ - 值(value)与对象

r - 根据列索引对矩阵的行求和

c++ - vector (push_back); g++-O2;分段故障

c++ - 添加到整数对 vector 和字符串 vector 的元素在函数返回时被清除

c++ - 在 C++ 中使用 vector 设置并集算法