当前位置:  开发笔记 > 编程语言 > 正文

OpenMP vs gcc编译器优化

如何解决《OpenMPvsgcc编译器优化》经验,为你挑选了0个好方法。

我正在学习openmp,使用通过quadature计算pi值的例子.在串行中,我运行以下C代码:

double serial() {
    double step;
    double x,pi,sum = 0.0;

    step = 1.0 / (double) num_steps;

    for (int i = 0; i < num_steps; i++) {
        x = (i + 0.5) * step; // forward quadature
        sum += 4.0 / (1.0 + x*x);
    }
    pi = step * sum;

    return pi;
}

我将这与使用并行减少的omp实现进行比较:

double SPMD_for_reduction() {
    double step;
    double pi,sum = 0.0;

    step = 1.0 / (double) num_steps;

    #pragma omp parallel for reduction (+:sum)
    for (int i = 0; i < num_steps; i++) {
        double x = (i + 0.5) * step;
        sum += 4.0 / (1.0 + x*x);
    }
    pi = step * sum;

    return pi;
}

对于num_steps = 1,000,000,000,以及omp的6个线程,我编译和时间:

    double start_time = omp_get_wtime();
    serial();
    double end_time = omp_get_wtime();

    start_time = omp_get_wtime();
    SPMD_for_reduction();
    end_time = omp_get_wtime();

不使用cc编译器优化,运行时间约为4s(串行)和.66s(omp).使用-O3标志,串行运行时将降至".000001s",并且omp运行时基本不变.这里发生了什么?是使用矢量指令,还是代码或定时方法不好?如果它是矢量化,为什么omp函数不会受益?

我正在使用的机器使用的是现代的6核Xeon处理器.

谢谢!

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有