大佬教程收集整理的这篇文章主要介绍了C 11与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的完全一致回答.
以上是大佬教程为你收集整理的C 11与OpenMP一起提供了较慢的可执行文件全部内容,希望文章能够帮你解决C 11与OpenMP一起提供了较慢的可执行文件所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。