Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;17并行算法vs tbb并行vs openmp性能_C++_Parallel Processing_C++17_Openmp_Tbb - Fatal编程技术网

C++ C++;17并行算法vs tbb并行vs openmp性能

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; 自动索引=标准:

由于c++17 std库支持并行算法,我原以为它是我们的首选,但在与
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