多线程循环通过4D阵列C ++

时间:2016-05-10 21:04:32

标签: c++ arrays multithreading multidimensional-array openmp

我有很多函数循环存储在4D数组中的数据。我们正在使用一些OpenMP来帮助在最有意义的位置迭代这些数据,并且我们不会覆盖这些数据。

例如,我有以下代码片段:

void MaximumCombiner::createComplexData(double**** input, const int nX, const int nY,
                                        const int nZ, const int nA, std::complex<double>**** output,
                                        const double* beamData)
{
    for(int iX = 0; iX < nX; ++iX)
    {
        for(int iY = 0 ; iY < nY ; ++iY)
        {
            std::complex<double> complexArg(0.0, (beamData[iY] * M_PI / 180.0));
            std::complex<double> complexExp = std::exp(complexArg);

            for(int iZ = 0; iZ < nZ; ++iZ)
            {
                for(int iA = 0 ; iA < nA ; ++iA)
                {
                    output[iX][iY][iZ][iA] = input[iX][iY][iZ][iA] * complexExp;
                }
            }
        }
    }
}

最初,我认为我应该在每个for循环之前添加#pragma omp parallel for,但现在我想知道我是否花费更多时间来创建/删除线程的开销而不是实际工作。我也尝试在第一个for循环上方使用#pragma omp parallel并在其中一个内循环上粘贴#pragma omp for,但我不确定这是否也是最好的。在尝试决定将OMP调用放在何处时,我应该注意什么?

1 个答案:

答案 0 :(得分:0)

通常,直接的方法是在最外层的for循环中只放置一个Sun, Mon, Tue, Wed, Thr, Fri, Sat。这为您提供了最小的线程创建/删除开销。

然而,这种开销可能不是瓶颈。因此,您仍然需要对代码进行分析,以找出最佳方式,如评论所示。