2016-11-18 54 views
2

访问向量I具有矩阵:计算/使用并行编程C++

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

和向量​​:

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

其中 'mpStages' 是一个int值。在某一点上,我应用了以下情况的功能:

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'的另一个向量。 “计算”是如下:

double AbstractOptionSolver::CalculateS(int n, int i) 
{ 
    return pow(*mpUp,i) * pow(*mpDown, n-i) * *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崩溃,由于除了“OMP并行”的平行,只包括推回。想知道是否有人知道为什么会发生这种情况?

我也试图进一步了解并行编程,以了解何时/何时我不能在一个函数中使用它,因为某些函数有时会使某些方面并行导致此代码崩溃,原因不明。如果有人有任何消息来源帮助我解决这个问题,那将会很棒。

+0

这里的比赛条件 –

+0

即使我只是在矩阵@appleapple的两个不同位置应用推回? – mwtmurphy

回答

0

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

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

我不知道你为什么使用std :: vector指针和新语法。通常使用带RAII的向量,并避免新的/删除调用。

+0

我已经在问题中提供了我想要做的事情,用两段不同的代码显示我在哪里以及我想要感知的内容。我会看看链接,看看它是否给了我更好的见解。 此外,我使用新的语法,因为这些向量位于一个方法中,该方法是可能不会被删除的对象的一部分,但是可以使用重复数千到数十万次的方法进行编辑。因此,我会遇到分配错误,建立没有新/删除语法的向量 – mwtmurphy

+0

主要是我被#pragma omp并行部分的代码片断困惑。从你发布的内容看,你似乎试图并行化单个push_back语句,这是行不通的。但是,如果线程执行更多操作并预先分配了缓冲区,则应该能够对整个代码进行并行处理,但如果不知道发布的代码段之外发生了什么,则无法分辨。 – aah

+0

我试图并行化推回和矢量计算,所有信息都已知,并且在读/写中没有重叠。它只是不起作用?还是有没有理由不工作?如果我不得不预先分配然后分配值,那么考虑到我不知道在这个矩阵中有多少列,试图尝试对这部分进行并行化确实没有意义?为了向你展示这个函数之外发生了什么是不可能的,因为它是一个包含多个交互类的大型项目的一部分。这将是一个巨大的代码显示。 – mwtmurphy

0

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

+0

并行for循环修改相同的向量/矩阵内的数据已为我工作。为什么它会在此之外应用锁定? – mwtmurphy

+0

而不是理论,我会尝试设置锁,以检查锁是否解决崩溃。 – Ripi2

+0

会试一试。感谢帮助。 – mwtmurphy