并行 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太小了
感谢您的帮助!
我正在研究 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太小了
感谢您的帮助!