我正在研究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
尝试添加['-D_GLIBCXX_PARALLEL'](https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode_using.html)。您的硬件实际上是否具有您要求的硬件并行性? – Drop
谢谢,可悲的是国旗并没有改变任何东西。我有4个CPU核心,终端中的'lscpu'也是这样说的。 – Tommekk
为什么'-O0'在比较性能的时候?如果您想要现实的性能数字,请启用优化。 –