Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用并行编程C++;_C++_Matrix_Vector_Parallel Processing - Fatal编程技术网

C++ 使用并行编程C++;

C++ 使用并行编程C++;,c++,matrix,vector,parallel-processing,C++,Matrix,Vector,Parallel Processing,我有一个矩阵: std::vector<std::vector<double> >* p_mat_cache = new std::vector<std::vector<double> >(3, std::vector<double>()); pValVec1和pMatCache对应于本地名称。pValVec2是长度为“mpStages-1”的另一个向量计算结果如下: double AbstractOptionSolver:

我有一个矩阵:

std::vector<std::vector<double> >* p_mat_cache = 
    new std::vector<std::vector<double> >(3, std::vector<double>());
pValVec1和pMatCache对应于本地名称。pValVec2是长度为“mpStages-1”的另一个向量计算结果如下:

double AbstractOptionSolver::CalculateS(int n, int i)
{
    return pow(*mpUp,i) * pow(*mpDown, n-i) * *mpS;
}
#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]);
其中,私有变量“*mpS”、“*mpUp”和“*mpDown”在代码实现过程中不会更改。我想做的是并行运行其中的一部分,我假设可以如下所示:

double AbstractOptionSolver::CalculateS(int n, int i)
{
    return pow(*mpUp,i) * pow(*mpDown, n-i) * *mpS;
}
#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。您可能想看看如何基于索引进行并行化。但是考虑到代码片段,很难准确地说出您想要做什么

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


我不知道为什么要在std::vector中使用指针和新语法。通常使用vector和RAII,避免新的/删除调用。

在进行并行编程时,必须注意“锁定数据”。此技术可防止两个(或更多)线程同时修改相同的数据,从而损坏数据。

此处的竞态条件,即使我只是在矩阵@appleapple?Parallel的两个不同位置应用回推,对于修改同一向量/矩阵中的数据的循环,也适用于我。为什么它会在这之外应用锁定?我会尝试设置锁定,以检查锁定是否解决了崩溃。我会尝试一下。感谢您的帮助。我已经用两段不同的代码提供了我想在这个问题上做的事情,这两段代码显示了我的位置和我试图在感知上实现的目标。我会看看链接到虽然,看看它是否给我一个更好的见解。此外,我还使用了新的语法,因为向量存在于一个方法中,该方法是对象的一部分,该对象可能不会被删除,但可以通过重复数千到几十万次的方法进行编辑。因此,我会遇到在没有new/delete语法的情况下建立向量的分配错误。我被代码片段和#pragma omp并行部分弄糊涂了。从您发布的内容来看,似乎您正在尝试并行化单个push_-back语句,这是行不通的。但是,如果你让线程做更多的工作并预先分配缓冲区,那么你应该能够整体并行化你的代码,但是如果不知道在你发布的代码片段之外发生了什么,就不可能说出来。我正在尝试并行化推送和向量计算,所有信息都是已知的,而且读/写操作没有重叠。难道它就是不起作用吗?还是说它不起作用有什么原因?如果我必须预先分配然后分配值,那么鉴于我不知道这个矩阵中会有多少列,那么尝试并行化这个部分肯定没有意义?要在这个论坛上向您展示这个函数之外的情况是不可能的,因为它是一个大型项目的一部分,有几个交互类。这将是一个巨大的代码块。延迟回复,但根据您编写的内容,立即提高性能的最佳方法是使用vector reserve函数。推回是不可并行的,因为每次超过保留堆大小时,它都会重新分配向量的内存。内部指针可能在每次调用时都会更改,因此每个线程最终可能会使用不同的内存指针,因为stl容器更改通常是非线程安全的。这也是您可能在该代码中受到性能影响的原因,每次推回都会导致向量重新分配。大量使用reserve会有所帮助。至于并行化,如果您没有关于新的可能列的信息,我看不到一种简单的并行化方法。