Parallel processing 使用openmp的巨大速度降低

Parallel processing 使用openmp的巨大速度降低,parallel-processing,openmp,Parallel Processing,Openmp,我正在测试一小段代码的速度,如下所示: for(i=0;i<imgDim;i++) { X[0][i] = Z[i] - U1[i] * rhoinv; X[1][i] = Z[i] - U2[i] * rhoinv; X[2][i] = Z[i] - U3[i] * rhoinv; } (i=0;i时间表(动态)引入了巨大的运行时开销。它只应用于每次迭代可能需要不同时间的循环,改进的

我正在测试一小段代码的速度,如下所示:

for(i=0;i<imgDim;i++)
        {
            X[0][i] = Z[i] - U1[i] * rhoinv;
            X[1][i] = Z[i] - U2[i] * rhoinv;
            X[2][i] = Z[i] - U3[i] * rhoinv;
        }
(i=0;i
时间表(动态)
引入了巨大的运行时开销。它只应用于每次迭代可能需要不同时间的循环,改进的负载平衡将证明开销是合理的。对于像您这样的常规循环,动态调度是一种过激行为,因为它引入了不必要的开销,从而降低了计算速度

将计划类型更改为“静态”:

#pragma omp parallel for schedule(static) 
for(i=0;i<imgDim;i++)
{
    X[0][i] = Z[i] - U1[i] * rhoinv;
    X[1][i] = Z[i] - U2[i] * rhoinv;
    X[2][i] = Z[i] - U3[i] * rhoinv;
}
#计划的pragma omp并行(静态)

对于(i=0;iYou可能是内存受限的——如果您的内存总线已经饱和,有更多线程堆积在请求上(以及有自己的开销,包括上下文切换的内存访问)我猜问题是,每个线程的工作量只有几倍和几次加法,完全被创建/运行/销毁并行线程的代码淹没了
#pragma omp parallel for schedule(static) 
for(i=0;i<imgDim;i++)
{
    X[0][i] = Z[i] - U1[i] * rhoinv;
    X[1][i] = Z[i] - U2[i] * rhoinv;
    X[2][i] = Z[i] - U3[i] * rhoinv;
}