2016-08-12 125 views
1

我正在研究Barnes-Hut算法的并行STL实现。并行libstdC++模式不使用并行for_each算法迭代器

出于性能方面的问题,我想尝试的一些算法从的libstdC++ https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

这个扩展也将与新的C++ 17个标准并行模式。

要计算每个物体的有效加速度,我使用名称空间__gnu_parallel中的for_each算法。要使用顺序算法,您可以将其替换为std

要编译程序,我使用版本为5.4.0的g ++,并调用它g++-5 -fopenmp -O0 -g -Wall -fmessage-length=0 -std=c++1z -c -o BarnesHutCPU.o BarnesHutCPU.cpp 对于并行算法,使用OpenMP。这是-fopenmp的原因。

但是,顺序和并行使用for_each的时间几乎相同。当你在for_each循环中调用omp_get_num_threads()时,你会得到只有一个线程用于完整循环的原因。

所以我的问题是:为什么算法不是并行执行,我必须得到并行执行?我也试过。

我不想使用正常的for循环,因为我必须使用STL算法。 (其中一个原因是,我想用后推力)

这是最重要的部分代码与N=750

void calcAcc() 
{ 
    double theta = 0.5; 
    __gnu_parallel::for_each(counting_iterator<int>(0), counting_iterator<int>(N), [&](const int &i){ 
     ... 
    } 
} 

counting_iterator<T>boost::counting_iterator<T>

问候 Tommekk

+0

尝试添加['-D_GLIBCXX_PARALLEL'](https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode_using.html)。您的硬件实际上是否具有您要求的硬件并行性? – Drop

+0

谢谢,可悲的是国旗并没有改变任何东西。我有4个CPU核心,终端中的'lscpu'也是这样说的。 – Tommekk

+2

为什么'-O0'在比较性能的时候?如果您想要现实的性能数字,请启用优化。 –

回答

1

好了,原因是-O0标志。使用-O3时,它使用我的4个CPU,我也可以在系统监视器中看到这些CPU。起初我没有看到任何效果,因为我的N很小。

感谢您的帮助!