2014-04-08 90 views
2

在C++庫中是否有一個簡單函數,您可以在其中執行類似Concurrency::max(vec)這裏vec是一個數字向量?我可以寫我自己的,但我希望我能救自己的工作。在ppl.h中查找最大值

編輯:對不起,我可能不夠清楚。我需要最大化函數來利用並行化。

+0

看起來你需要[做的map-reduce(http://msdn.microsoft.com/en-us/library/hh873179。 aspx),但說實話這實際上是一個分區鴻溝和征服問題。 – Mgetz

+0

我不明白我可以如何使用map-reduce。猜猜我必須寫出自己的分而治之的方法。 – spurra

+0

好吧,這是殘酷的誠實,除非這個向量是在千兆字節的數量級,並部分交換到磁盤。使用[基於值'max'](http://randomascii.wordpress.com/2013/11/24/stdmin-causing-three-times-slowdown-on-vc/)的單線程方法可能會擊敗任何東西在平行下。現代CPU對於這類事情非常非常優化。 – Mgetz

回答

2

沒有內置任何東西,但它可以通過組合(縮減變量)和並行循環(這裏是parallel_for_each)直接進行。但是,如果您所做的工作只是數字的「最大值」,除非您所查看的數字量非常大,否則可能很難看到加速。

你可以閱讀更多關於它的msdn

#include <ppl.h> 
#include <climits> 
#include <vector> 
#include <numeric> 
#include <iostream> 
using namespace Concurrency; 
int main(int argc, _TCHAR* argv[]) 
{ 
    std::vector<int> vec(10); 
    std::iota(begin(vec), end(vec), 1); 
    combinable<int> locals([]{ return INT_MIN; }); 
    parallel_for_each(begin(vec), end(vec), [&locals](int cur){ 
     auto & localMax = locals.local(); 
     localMax = std::max(cur, localMax); 
    }); 
    std::cout << "max is " << locals.combine([](int left, int right){ return std::max<int>(left, right);}) << std::endl; 
    return 0; 
} 
0

它只是一個std::vector?如果是這樣,你可以使用max_element

auto it = std::max_element(std::begin(vec), std::end(vec)); 

迭代器it再分在具有最大值的向量元素。

+0

這是否並行運行? – spurra

+0

對於一個單一的矢量'vec'不,我不這麼認爲。它基本上只是將整個向量從'begin()'遍歷到'end()'並跟蹤最大元素。 – CoryKramer

+0

我的道歉不夠清楚。我想最大化的功能來利用我所有的CPU核心。我穿過的矢量相當大。 – spurra