并行 libstdc++ 模式不对迭代器使用并行 for_each 算法

parallel libstdc++ mode not using parallel for_each algorithm for iterators

我正在研究 Barnes-Hut-Algorithm 的并行 STL 实现。

出于性能问题,我想尝试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() 时,你会得到一个线程用于整个循环的原因。

所以我的问题是:为什么算法不是并行执行的,我需要做什么才能并行执行? 我也用 OMP_NUM_THREADS=4 ./BarnesHutCPU.

试过了

我不想使用普通的 for 循环,因为我必须使用 STL 算法。 (一个原因是,我以后想用Thrust)

这是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>

问候 托梅克

好的,原因是 -O0 标志。使用 -O3 它使用我的 4 个 CPU,我也可以在系统监视器中看到。一开始没看到效果,因为我的N太小了

感谢您的帮助!