C++ C++;17并行算法vs tbb并行vs openmp性能
由于c++17 std库支持并行算法,我原以为它是我们的首选,但在与C++ C++;17并行算法vs tbb并行vs openmp性能,c++,parallel-processing,c++17,openmp,tbb,C++,Parallel Processing,C++17,Openmp,Tbb,由于c++17 std库支持并行算法,我原以为它是我们的首选,但在与tbb和openmp进行比较后,我改变了主意,我发现std库要慢得多 通过这篇文章,我想征求专业人士的意见,关于我是否应该放弃std库的并行算法,使用tbb或openmp,谢谢 环境: MacOSX,卡塔利纳10.15.7 GNU g++-10 基准代码: #包括 #包括 #包括 #包括 #包括 #包括 #包括 常数大小N=1000000; 用于()的双标准_{ 自动值=标准::向量(N); 尺寸为5lu; 自动索引=标准:
tbb
和openmp
进行比较后,我改变了主意,我发现std库要慢得多
通过这篇文章,我想征求专业人士的意见,关于我是否应该放弃std库的并行算法,使用tbb
或openmp
,谢谢
环境:
- MacOSX,卡塔利纳10.15.7
- GNU g++-10
#包括
#包括
#包括
#包括
#包括
#包括
#包括
常数大小N=1000000;
用于()的双标准_{
自动值=标准::向量(N);
尺寸为5lu;
自动索引=标准::向量(n_par);
std::iota(index.begin()、index.end()、0lu);
步幅大小=静态施法(N/N标准杆)+1;
std::每个(
标准::执行::标准杆,
index.begin(),
index.end(),
[&](大小索引){
int begin=索引*步幅;
int end=(指数+1)*步幅;
for(int i=begin;i 对于(int i=r.begin();i如果以不同的顺序调用不同的方法,您是否会得到类似的结果?不同的向量可能会重用上一个函数释放的内存,从而减少后续函数的缓存未命中。OpenMP对std::exp和std::sin使用SIMD优化。您可以尝试更改基准,即构建所有测试s分离可执行文件并使用最大优化,如:-mntune=native-O3
。如果将std_放在最后,结果如何?@VictorGubin否,GCC上没有SIMD优化。首先,未指定SIMD
(尽管GCC通常不关心它)此外,--fast math
到目前为止,在GCC上应用矢量化非常困难(因为很难支持严格的IEEE-754合规性)。实际上,矢量化是在GCC上独立于OpenMP完成的。您可以。第一个OpenMP并行区域很慢(-er)因为它带来了线程团队。始终在一个“预热”并行区域后测量OpenMP程序的性能。我要求您切换调用,因为这会将启动开销从std_for()
部分移动到omp_for()
部分。
g++ --std=c++17 -O3 b.cpp -ltbb -I /usr/local/include -L /usr/local/lib -fopenmp
std_for, rez = 500106, dur = 11119
tbb_for, rez = 500106, dur = 7372
omp_for, rez = 500106, dur = 4781
seq_for, rez = 500106, dur = 27910
>>> ./a.out seq_for
seq_for, rez = 500106, dur = 29885
>>> ./a.out tbb_for
tbb_for, rez = 500106, dur = 10619
>>> ./a.out omp_for
omp_for, rez = 500106, dur = 10052
>>> ./a.out std_for
std_for, rez = 500106, dur = 12423