我有很多函数循环存储在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调用放在何处时,我应该注意什么?
答案 0 :(得分:0)
通常,直接的方法是在最外层的for循环中只放置一个Sun, Mon, Tue, Wed, Thr, Fri, Sat
。这为您提供了最小的线程创建/删除开销。
然而,这种开销可能不是瓶颈。因此,您仍然需要对代码进行分析,以找出最佳方式,如评论所示。