C 11与OpenMP一起提供了较慢的可执行文件

C 11与OpenMP一起提供了较慢的可执行文件,第1张

概述我正在尝试学习OpenMP,并希望使用OpenMP学习加速.为此,我写了以下小程序: #include <vector>#include <cmath>int main() { static const unsigned int testDataSize = 1 << 28; std::vector<double> a (testDataSize), b (testData 我正在尝试学习OpenMP,并希望使用OpenMP学习加速.为此,我写了以下小程序:

#include <vector>#include <cmath>int main() {    static const unsigned int testDataSize = 1 << 28;    std::vector<double> a (testDataSize),b (testDataSize);    for (int i = 0; i < testDataSize; ++i) {        a [i] = static_cast<double> (23 ^ i) / 1000.0;    }    b.resize(testDataSize);    #pragma omp parallel for    for (int i = 0; i < testDataSize; ++i) {        b [i] = std::pow(a[i],3) * std::exp(-a[i] * a[i]);        b [i] += std::pow(a[i],5) * std::exp(-a[i] * a[i]);        b [i] += std::pow(a[i],7) * std::exp(-a[i] * a[i]);        b [i] += std::pow(a[i],9) * std::exp(-a[i] * a[i]);        b [i] += std::pow(a[i],11) * std::exp(-a[i] * a[i]);        b [i] += std::pow(a[i],13) * std::exp(-a[i] * a[i]);        b [i] += std::pow(a[i],15) * std::exp(-a[i] * a[i]);        b [i] += std::pow(a[i],17) * std::exp(-a[i] * a[i]);        b [i] += std::pow(a[i],19) * std::exp(-a[i] * a[i]);        b [i] += std::pow(a[i],21) * std::exp(-a[i] * a[i]);    }    return 0;}

我使用或不使用-std = c 11指令编译了上面的代码.我注意到当我使用-std = c 11指令时,我的代码运行速度大约慢了8倍,因为没有使用它.我在linux Debian系统上使用-O3和gcc版本4.9.2.此外,当我在不使用OpenMP的情况下比较执行时间时,我注意到速度差异.因此,在我看来,-std = c 11存在问题,而不是OpenMP存在问题.

详细地说,我获得了以下执行时间(使用linux time命令测量)

使用OpenMP编译和-std = c 11:35.262s

仅使用OpenMP编译:5.875s

仅使用-std = c 11:2m12进行编译

没有OpenMP的编译和-std = c 11:23.757s

使用-std = c 11时执行时间慢得多的原因是什么?

非常感谢任何帮助或建议!

在我的拙见中,我已经标记了最好的答案.在olen的回答的后续内容中,我已经制作了自己的pow(double,int)函数,如下所示:

double my_pow(double base,int exp) {    double result = 1.0;    while (exp) {        if (exp & 1)            result *= base;        exp >>= 1;        base *= base;    }    return result;}

我不确定这是否是计算某个基数的整数幂的最有效方法,但是在使用或不使用std = c 11进行编译时,使用此函数可以得到与计算效率完全相同的结果与olen的完全一致回答.

解决方法 原因是没有-std = c 11的版本使用std :: pow(double,int),这显然在C 11中不可用,并且比std :: pow(double,double)更快.如果用双打(3.0,5.0等)替换整数(3,5等),您将获得相同的速度.

编辑:以下是g版4.8.4的时间安排:原始版本:-O3 -fopenmp:10.678秒-O3 -fopenmp -std = c 11:36.994 s在整数后添加“.0”:-O3 -fopenmp:36.679秒-O3 -fopenmp -std = c 11:36.938 s

总结

以上是内存溢出为你收集整理的C 11与OpenMP一起提供了较慢的可执行文件全部内容,希望文章能够帮你解决C 11与OpenMP一起提供了较慢的可执行文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222061.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存