2016-08-12 72 views
1

我正在研究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

+0

嘗試添加['-D_GLIBCXX_PARALLEL'](https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode_using.html)。您的硬件實際上是否具有您要求的硬件並行性? – Drop

+0

謝謝,可悲的是國旗並沒有改變任何東西。我有4個CPU核心,終端中的'lscpu'也是這樣說的。 – Tommekk

+2

爲什麼'-O0'在比較性能的時候?如果您想要現實的性能數字,請啓用優化。 –

回答

1

好了,原因是-O0標誌。使用-O3時,它使用我的4個CPU,我也可以在系統監視器中看到這些CPU。起初我沒有看到任何效果,因爲我的N很小。

感謝您的幫助!