gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:23:59 26 4
gpt4 key购买 nike

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

对于性能问题,我想尝试 libstdc++ 中某些算法的并行模式 https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

此扩展也将随新的 C++17 标准一起提供。

为了计算每个物体的有效加速度,我使用 for_each来自命名空间 __gnu_parallel 的算法.要使用顺序算法,可以将其替换为 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的顺序和并行使用的时间几乎相同。当你调用 omp_get_num_threads()for_each循环,你明白了整个循环只使用一个线程的原因。

所以我的问题是:为什么算法不是并行执行的,我需要做什么才能并行执行? 我也试过 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 太小了。

感谢您的帮助!

关于c++ - 并行 libstdc++ 模式不对迭代器使用并行 for_each 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38923542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com