C++ 使用OpenMP或_gnu_并行进行并行计算不会加快代码的速度

C++ 使用OpenMP或_gnu_并行进行并行计算不会加快代码的速度,c++,parallel-processing,openmp,C++,Parallel Processing,Openmp,我有这段代码。我正在尝试应用OpenMP,\uuuu gnu\u parallel::for_each,并使其并行,但这些方法都不起作用 我该怎么办? 这里make是集合的向量,集合中包含的类型是OctCell* 该算法给出了正确的输出,但没有加快代码的速度。我有4个核 void Oct :: applyFunction3(void (*Function)(OctCell* cell), unsigned int level) { __gnu_parallel::for_each(mak

我有这段代码。我正在尝试应用OpenMP,
\uuuu gnu\u parallel::for_each
,并使其并行,但这些方法都不起作用

我该怎么办? 这里make是集合的向量,集合中包含的类型是
OctCell*

该算法给出了正确的输出,但没有加快代码的速度。我有4个核

void Oct :: applyFunction3(void (*Function)(OctCell* cell), unsigned int level)
{
    __gnu_parallel::for_each(make.at(level).begin(),make.at(level).end(),Function);
}
功能是

void directionalSweepX(OctCell* cell) {
OctCell* positiveCell,*negativeCell;
     positiveCell = cell->getNeighbour(RIGHT);
   negativeCell = cell->getNeighbour(LEFT);
    addFluxToConserveds(cell, positiveCell, negativeCell, X);
}
addFluxtoConserveds执行以下操作

void addFluxToConserveds(OctCell* cell, OctCell* positiveCell, OctCell* negativeCell, SWEEP_DIRECTION direction) {

    double deltaT = pow(2.0, cell->getLevel() - cell->getParentOct()->lMin)*gDeltaT;
    // You have corrected that delta t is delta (L)
    double alpha = (1 << (int) cell->getParentOct()->lMin) * gDeltaT/gL;// whats the purpose f <<

    double beta = alpha/8.0;
    double gamma;
    double Flux[5] = {0.0, 0.0, 0.0, 0.0, 0.0};

    if ( positiveCell == 0) {
        Flux[direction+1] = getPressure(cell);
    } else if ( positiveCell->isLeaf() ) {
        computeFlux(cell, positiveCell, direction, Flux);
        gamma = (positiveCell->getLevel() == cell->getLevel())  ? alpha : beta;
    }

    for (int i=0; i<5; i++) {
        cell->mConserveds_n[i] -= alpha * Flux[i];
        if (positiveCell) positiveCell->mConserveds_n[i] += gamma * Flux[i];
    }

    Flux[0] = Flux[1] = Flux[2] = Flux[3] = Flux[4] = 0.0;

    if ( negativeCell == 0 ) {
        Flux[direction+1] = getPressure(cell);
    } else if (negativeCell->isLeaf() && negativeCell->getLevel() == cell->getLevel() - 1 ) {
        computeFlux(negativeCell, cell, direction, Flux);
    }

    for (int i=0; i<5; i++) {
        cell->mConserveds_n[i] += alpha * Flux[i];
        if (negativeCell) negativeCell->mConserveds_n[i] -= beta * Flux[i];
   }

}
void addFluxToConserved(八单元*单元,八单元*正单元,八单元*负单元,扫描方向){
double deltaT=pow(2.0,cell->getLevel()-cell->getParentOct()->lMin)*gdelat;
//您已经更正了delta t是delta(L)
double alpha=(1 getParentOct()->lMin)*gdelat/gL;//isLeaf()的用途是什么){
计算通量(电池、正极电池、方向、流量);
gamma=(阳性细胞->获取水平()==细胞->获取水平())?α:β;
}
对于(int i=0;imConserveds_n[i]=alpha*通量[i];
如果(正电荷)正电荷->mConserveds_n[i]+=伽马*通量[i];
}
通量[0]=通量[1]=通量[2]=通量[3]=通量[4]=0.0;
如果(negativeCell==0){
流量[方向+1]=获得压力(单元);
}else if(negativeCell->isLeaf()&&negativeCell->getLevel()==cell->getLevel()-1){
计算通量(负电荷、电池、方向、通量);
}
对于(int i=0;imconservateds_n[i]+=alpha*通量[i];
if(negativeCell)negativeCell->mConserveds_n[i]=beta*通量[i];
}
}
使用
#包括

在函数
addFluxtoConserveds
中,您可以在两个for循环中添加一个
#pragma omp for
。这是因为每个迭代不依赖于其他循环来完成。 因为您有一个对第二个for循环非常重要的顺序代码,所以不能在这里使用
部分
任务

applyFunction3
的顺序实现是什么

您必须记住OpenMP的一个关键点。在某个体系结构上编译的程序不会针对所有其他体系结构进行优化,即使是在同一系列处理器中(intel core duo vs intel dual core;intel vs amd;等等)。
这意味着它在编译的原始体系结构上运行得很快,而在其他体系结构上运行得很快,这只是运气。

该函数在给定指针的octcell上运行。对,但它做了什么?(它可能不是一个并行性很好的操作。)void directionalSweepX(octcell*cell){OctCell*positiveCell,*negativeCell;positiveCell=cell->GetNeighbor(右);negativeCell=cell->GetNeighbor(左);AddFluxToConserved(cell,positiveCell,negativeCell,X);}你的向量中有多少个
OctCell
s?如果它很少,那么将任务分配给线程的开销可能会抵消你的并行计算增益。我已经添加了函数。OctCell的数量是200000。但是并行的东西对这两个循环不起作用……它根本没有加速。我现在该怎么办你能给我你的邮件id吗?有5次迭代,其中包含简单的操作。它们的执行速度非常快,这意味着在这种情况下,你应该看看线程开销是否比sequential for更糟。但是除了个人观察之外,你如何衡量算法的速度?(代码是什么)将pragma应用到该部分会使代码变得更慢。再说一遍,
applyFunction3
的目的是什么,以及如何实现
computeflux