Re: [心得] C++17 execution policy

楼主: Caesar08 (Caesar)   2016-05-17 10:35:12
原文 #1NERrsxa
※ 引述《IKAFIRE (没有)》之铭言:
: 因为推文感觉问题描述不清楚,干脆回一篇问问题
: 看完这三个policy之后对于他的设计感到有点疑惑,因此跑回去看draft
: 这是今年二月的版本
: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0024r1.html
: 前一篇已经把这个草稿的精髓描述过了
: 我在这边只节录草稿中对于每个policy效果的描述
: ##sequential_execution_policy
: The invocations of element access functions in parallel algorithms invoked
: with an execution policy object of type sequential_execution_policy are
: indeterminately sequenced (in) the calling thread.
: 基本上似乎是个fallback用的policy,让你在不改变呼叫形式的情况下也可以避免平行化
: 只是有个疑问,为什么要设计成“不保证执行顺序 (indeterminately sequenced)”呢?
: 有趣的是在2015的初稿中,原本是保证依序执行的,不知什么原因被改掉了
如果你是问为什么不改成sequential,那解答应该是
这样跟不用execution policy一样,那这样就不需要有这个execution policy了
如果你是问为什么不改成unsequenced,那解答应该是
标准应该增加一个std::unsequenced_execution_policy
(可针对block operation提升效能)
然后sequential_execution_policy名字应该要更改,因为原本的意思已经不见了
不知道这样有没有解答你的疑问
(底下新增Jared Hoberock的回答)
: ##parallel_execution_policy
: The invocations of element access functions in parallel algorithms invoked
: with an execution policy object of type parallel_execution_policy are
: permitted to execute in an unordered fashion in either the invoking thread or
: in a thread implicitly created by the library to support parallel algorithm
: execution.
: 还蛮好想像的行为,没什么问题

所以要用execution policy的人,应该先了解thread的概念
: ##parallel_vector_execution_policy
: The invocations of element access functions in parallel algorithms invoked
: with an execution policy of type parallel_vector_execution_policy are
: permitted to execute in an unordered fashion in unspecified threads, and
: unsequenced with respect to one another within each thread.
: 问题来了,这个policy的优点何在?
: 乍看之下与parallel_execution_policy相较没有额外的好处,还会引入很多问题
: 例如前篇也提过的,许多synchronization都可能会变成deadlock
: 什么样的情况下会不用上一个policy而采用这个?
vector<size_t> num{1,2};
vector<int> input{4,3};
vector<int> output(2);
for_each(par_vec,cbegin(vec),cend(vec),[&](const auto val){
//do something according to input[val]
//save result to output[val]
});
以这例子来说,parallel_vector_execution_policy能执行更快
因为每个func互不干涉(我已经给func需要的资料)
所以如果不用进行synchronize,用parallel_vector_execution_policy会更好
另外,还要提一点,如果你的func里面有block operation
那使用parallel_vector_execution_policy应该会更快
作者: LPH66 (-6.2598534e+18f)   2016-05-17 10:39:00
所以应该就是这个 policy 提供 vectorization 的机会这样
作者: IKAFIRE (没有)   2016-05-17 10:58:00
vectorize那边我懂了,感谢。关于sequential policy我的理解是为了用同一个函式签名也能以未平行化方式执行,而次序就不重要,但应该没有必要为了“和没policy不一样”而强调不依序执行?因为文中的解答是“这样跟不用execution policy一样,那这样就不需要有这个execution policy了”但我觉得应该不是因为这个原因而这样设计的
作者: BlazarArc (Midnight Sun)   2016-05-20 11:52:00
作者: IKAFIRE (没有)   2016-05-20 16:51:00
我了解了,非常感谢

Links booklink

Contact Us: admin [ a t ] ucptt.com