我正在研究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'在比較性能的時候?如果您想要現實的性能數字,請啓用優化。 –