2010-01-14 130 views
3

爲什麼此代碼不能並行std :: for_each()時,它完全正常工作與std :: sort()?並行for_each使用openmp

我該如何解決?

g++ -fopenmp -D_GLIBCXX_PARALLEL=1 -o p p.cc && time ./p sort 

Linux上的GCC 4.3。

#include <cstdio> 
#include <algorithm> 
#include <vector> 
#include <cstring> 

void delay() 
{ 
     for(int c = 0; c < 1000000; c++) { 
    } 
} 

int lt(int a, int b) 
{ 
     delay(); 
     return a < b; 
} 

void noop(int a) 
{ 
    delay(); 
} 

int main(int argc, char **argv) 
{ 
     if (argc < 2) { 
       printf("%s <sort | for_each>\n", argv[0]); 
       return 1; 
    } 

     std::vector<int> foo(10000); 

     if (!strcmp(argv[1], "sort")) { 
     std::sort(foo.begin(), foo.end(), lt); 
    } else if (!strcmp(argv[1], "for_each")) { 
       std::for_each(foo.begin(), foo.end(), noop); 
    } 
} 

回答

6

只是-D_GLIBCXX_PARALLEL編譯不一定並行所有算法(參見here):

請注意,這並不一定意味着一切都將結束以並行方式執行,但而是將編碼成並行版本的啓發式和設置用於確定是否使用並行變體來執行全部,部分或不使用算法。

但是,Configuration and tuning章可能會幫助您強制並行化。

只是說明你的「標杆」: std::sortstd::for_each不一定會調用delay()相同的次數。 std::for_each調用延遲方法N次,std::sort調用N log(N)N^2次之間的值(請參閱reference)。因此,衡量執行時間只會給你一個關於並行化的弱點。

+0

我知道Big-Oh,它只是讓它足夠慢而能看到「top」和「time」。 – Thomas 2010-01-14 21:34:28

+0

您的配置和調整鏈接幫助。這使得for_each()並行: std :: for_each(foo.begin(),foo.end(),noop,_gnu_parallel :: parallel_balanced); – Thomas 2010-01-14 21:35:31