2016-10-03 98 views
1

更快我有這樣的代碼(僞代碼,因爲我無法證明我的程序):parallel_for時ppl.h不超過連續C++

concurrent_vector a, b, c; 
concurrent_unordered_map mapForResult; 

for(i=0; i<sequenceCount; i++){ 
    variables temp_a, temp_b, temp_c; 
    database->read(&a, &b, &c); 
} 

parallel_for(0, sequenceCount, [](int i){ 
    var aa = a[i]; 
    var bb = b[i]; 
    var cc = c[i]; 

    resultOfFunction = MakeFunction(aa, bb, cc); 

    mapForResults.insert(resultOfFunction); 
}, static_partitioner()); 

它的工作,但它比串行版本慢得多。任何想法爲什麼?這是我第一次與ppl.h,所以我不知道所有的技巧&技巧。

+0

這兩個循環之間的緩存表現如何?在並行版本中你有很多緩存未命中嗎? – NathanOliver

+0

我如何驗證它?我是初學者在c + +和平行。 – Queen

+0

那麼如果你在Linux上,你可以使用[perf](http://stackoverflow.com/a/10114325/4342498)。 – NathanOliver

回答

0

程序的每個並行版本都需要比單線程版本更多的指令。在設置線程和管理對共享數據的訪問權限方面存在不可避免的開銷。這通常是有限的開銷,當有足夠的內核可用時,額外的指令不會轉化爲額外的時間。簡單地說,如果你有300%的額外內核,10%的開銷並不是什麼大問題。

在這種情況下,MakeFunction可能非常小。這意味着你有很多開銷,並且你的額外內核花費在mapForResults之上。

+0

不幸的是,MakeFunction很大。當我在小型數據庫(大約30個序列)上使用它時,它比順序快兩倍。但是當我試圖在數據庫上使用大約10000個序列時,它的功耗很低。 – Queen

+0

還有一個問題:如果我正在使用concurrent_vector或concurrent_unordered_map戰鬥可能會出現問題呢?我選擇了它而不是Critical_Section,因爲我認爲它不是在那麼作戰。 – Queen

+0

「MakeFunction很大」有點令人困惑 - 但隨後您會跟進「數據庫」。在添加單詞數據庫你改變了你的問題。也許你可以添加更多關於這個「MakeFunction」是什麼的信息。 – UKMonkey