简单的openmp调用for循环不起作用



我正在编写一些代码,这些代码肯定会从尝试集成openmp我正在编写的一些软件中受益。我是openmp的新手,在测试一些非常基本的测试代码(见下文)时,我注意到在激活openmp (#pragma行)的情况下,执行时间非常长。任何见解都非常感谢。

int main()
{
    int number=200;
    int max = 2000000;
    for(int t=1; t<max; t++)
    {
        double fac = 0.0;
#pragma omp parallel for reduction(+:fac)
        for(int n=2; n<=number; n++)
            fac += 1;
    }
    return 0;
}

当前编写的代码遇到并行区域max次。在OpenMP程序中进入并行区域的开销很小,但是会产生2000000次开销。您实际上并没有告诉我们运行时间是什么,但是我可以很容易地相信,这使得它们比串行版本长得多。我建议你把外环包裹在一个平行的区域,而不是内环。

在重写代码时要注意确保并行区域内的有效载荷是有效的,并向并行区域外的程序返回一些值。没有这些步骤,一个狡猾的优化编译器可以确定一个循环不返回任何程序的其余部分,并简单地优化它。

还插入一些计时指令(使用omp_get_wtime),重新运行您的代码,如果事情仍然不令人满意,用您收集的新信息更新您的问题

这是一段改进后的代码,实际上可以按预期工作。它基本上包裹了外部循环,而不是内部循环。在不支持openmp的情况下编译需要1.49秒,使用openmp时需要0.48秒。

int main()
{
    int number=200;
    int max = 2000000;
#pragma omp parallel for
    for(int t=1; t<max; t++)
    {
        double fac = 0.0;
        for(int n=2; n<=number; n++)
            fac += 1;
    }
    return 0;
}

最新更新