在C++庫中是否有一個簡單函數,您可以在其中執行類似Concurrency::max(vec)
這裏vec是一個數字向量?我可以寫我自己的,但我希望我能救自己的工作。在ppl.h中查找最大值
編輯:對不起,我可能不夠清楚。我需要最大化函數來利用並行化。
在C++庫中是否有一個簡單函數,您可以在其中執行類似Concurrency::max(vec)
這裏vec是一個數字向量?我可以寫我自己的,但我希望我能救自己的工作。在ppl.h中查找最大值
編輯:對不起,我可能不夠清楚。我需要最大化函數來利用並行化。
沒有內置任何東西,但它可以通過組合(縮減變量)和並行循環(這裏是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;
}
它只是一個std::vector
?如果是這樣,你可以使用max_element
。
auto it = std::max_element(std::begin(vec), std::end(vec));
迭代器it
再分在具有最大值的向量元素。
這是否並行運行? – spurra
對於一個單一的矢量'vec'不,我不這麼認爲。它基本上只是將整個向量從'begin()'遍歷到'end()'並跟蹤最大元素。 – CoryKramer
我的道歉不夠清楚。我想最大化的功能來利用我所有的CPU核心。我穿過的矢量相當大。 – spurra
看起來你需要[做的map-reduce(http://msdn.microsoft.com/en-us/library/hh873179。 aspx),但說實話這實際上是一個分區鴻溝和征服問題。 – Mgetz
我不明白我可以如何使用map-reduce。猜猜我必須寫出自己的分而治之的方法。 – spurra
好吧,這是殘酷的誠實,除非這個向量是在千兆字節的數量級,並部分交換到磁盤。使用[基於值'max'](http://randomascii.wordpress.com/2013/11/24/stdmin-causing-three-times-slowdown-on-vc/)的單線程方法可能會擊敗任何東西在平行下。現代CPU對於這類事情非常非常優化。 – Mgetz