261 lines
20 KiB
HTML
261 lines
20 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>并行扩展</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_experimental_parallelism skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">并行扩展</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-experimental.html">experimental</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p><br />
|
|
C++ 并行扩展 (C++ Extensions for Parallelism) , ISO/IEC TS 19570:2015 为 C++ 标准库定义下列新组件:</p>
|
|
<h3><span class="mw-headline" id=".E6.89.A7.E8.A1.8C.E7.AD.96.E7.95.A5">执行策略</span></h3>
|
|
<p>并行 TS 描述三种执行策略:<a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/parallelism/execution_policy&action=edit&redlink=1" class="new" title="cpp/experimental/parallelism/execution policy(页面不存在)">顺序</a>、<a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/parallelism/execution_policy&action=edit&redlink=1" class="new" title="cpp/experimental/parallelism/execution policy(页面不存在)">并行</a>和<a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/parallelism/execution_policy&action=edit&redlink=1" class="new" title="cpp/experimental/parallelism/execution policy(页面不存在)">并行加向量</a>,并提供对应的执行策略类型和对象。用户可以通过以对应类型的执行策略对象调用并行算法,静态地选择执行策略,或用类型擦除的 <code>execution_policy</code> 类动态地选择执行策略。</p>
|
|
<p>实现可以定义额外的执行策略为扩展。以实现定义类型执行策略对象调用并行算法的语义是实现定义的。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/header/experimental/execution_policy&action=edit&redlink=1" class="new" title="cpp/header/experimental/execution policy(页面不存在)"><experimental/execution_policy></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/execution_policy_tag_t&action=edit&redlink=1" class="new" title="cpp/experimental/execution policy tag t(页面不存在)"><span class="t-lines"><span>sequential_execution_policy</span><span>parallel_execution_policy</span><span>parallel_vector_execution_policy</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>执行策略类型<br />
|
|
<span class="t-mark">(类)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/execution_policy_tag&action=edit&redlink=1" class="new" title="cpp/experimental/execution policy tag(页面不存在)"><span class="t-lines"><span>seq</span><span>par</span><span>par_vec</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>全局执行策略对象<br />
|
|
<span class="t-mark">(常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/execution_policy&action=edit&redlink=1" class="new" title="cpp/experimental/execution policy(页面不存在)"><span class="t-lines"><span>execution_policy</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>动态执行策略<br />
|
|
<span class="t-mark">(类)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/is_execution_policy&action=edit&redlink=1" class="new" title="cpp/experimental/is execution policy(页面不存在)"><span class="t-lines"><span>is_execution_policy</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>测试类是否表示执行策略<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.BC.82.E5.B8.B8.E5.88.97.E8.A1.A8">异常列表</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/header/experimental/exception_list&action=edit&redlink=1" class="new" title="cpp/header/experimental/exception list(页面不存在)"><experimental/exception_list></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/exception_list&action=edit&redlink=1" class="new" title="cpp/experimental/exception list(页面不存在)"><span class="t-lines"><span>exception_list</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>在并行执行期间引发的异常<br />
|
|
<span class="t-mark">(类)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.97.A2.E5.AD.98.E7.AE.97.E6.B3.95.E7.9A.84.E5.B9.B6.E8.A1.8C.E5.8C.96.E7.89.88.E6.9C.AC">既存算法的并行化版本</span></h3>
|
|
<p>该 TS 为来自 <algorithm> 、 <numeric> 和 <memory> 的下列 69 个算法提供<a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/parallelism/existing&action=edit&redlink=1" class="new" title="cpp/experimental/parallelism/existing(页面不存在)">并行化版本</a>:</p>
|
|
<div style="margin-left:0px">
|
|
<table class="mw-collapsible mw-collapsed" style="background: transparent; text-align: left; border: 1px solid silver; margin: 0.2em auto auto; width:100%; clear: both; padding: 1px;">
|
|
<tr>
|
|
<th style="background: #F0F2F5; font-size:87%; padding:0.2em 0.3em; text-align:center;"><span style="font-size:115%">提供了并行化版本的标准库算法</span></th>
|
|
</tr>
|
|
<tr>
|
|
<td style="border: solid 1px silver; padding: 8px; background: white;">
|
|
<div class="div-col columns column-count column-count-3" style="-moz-column-count: 3; -webkit-column-count: 3; column-count: 3;">
|
|
<ul>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-adjacent_difference.html">std::adjacent_difference</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-adjacent_find.html">std::adjacent_find</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-all_any_none_of.html">std::all_of</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-all_any_none_of.html">std::any_of</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-copy.html">std::copy</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-copy.html">std::copy_if</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-copy_n.html">std::copy_n</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-count.html">std::count</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-count.html">std::count_if</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-equal.html">std::equal</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-fill.html">std::fill</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-fill_n.html">std::fill_n</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-find.html">std::find</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-find_end.html">std::find_end</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-find_first_of.html">std::find_first_of</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-find.html">std::find_if</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-find.html">std::find_if_not</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-generate.html">std::generate</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-generate_n.html">std::generate_n</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-includes.html">std::includes</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-inner_product.html">std::inner_product</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-inplace_merge.html">std::inplace_merge</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-is_heap.html">std::is_heap</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-is_heap_until.html">std::is_heap_until</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-is_partitioned.html">std::is_partitioned</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-is_sorted.html">std::is_sorted</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-is_sorted_until.html">std::is_sorted_until</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-lexicographical_compare.html">std::lexicographical_compare</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-max_element.html">std::max_element</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-merge.html">std::merge</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-min_element.html">std::min_element</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-minmax_element.html">std::minmax_element</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-mismatch.html">std::mismatch</a></span></li>
|
|
<li><a href="cpp-algorithm-move.html"><tt>std::move</tt></a></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-all_any_none_of.html">std::none_of</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-nth_element.html">std::nth_element</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-partial_sort.html">std::partial_sort</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-partial_sort_copy.html">std::partial_sort_copy</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-partition.html">std::partition</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-partition_copy.html">std::partition_copy</a></span></li>
|
|
<li><a href="cpp-algorithm-remove.html"><tt>std::remove</tt></a></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-remove_copy.html">std::remove_copy</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-remove_copy.html">std::remove_copy_if</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-remove.html">std::remove_if</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-replace.html">std::replace</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-replace_copy.html">std::replace_copy</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-replace_copy.html">std::replace_copy_if</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-replace.html">std::replace_if</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-reverse.html">std::reverse</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-reverse_copy.html">std::reverse_copy</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-rotate.html">std::rotate</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-rotate_copy.html">std::rotate_copy</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-search.html">std::search</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-search_n.html">std::search_n</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-set_difference.html">std::set_difference</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-set_intersection.html">std::set_intersection</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-set_symmetric_difference.html">std::set_symmetric_difference</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-set_union.html">std::set_union</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-sort.html">std::sort</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-stable_partition.html">std::stable_partition</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-stable_sort.html">std::stable_sort</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-swap_ranges.html">std::swap_ranges</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-transform.html">std::transform</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-memory-uninitialized_copy.html">std::uninitialized_copy</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-memory-uninitialized_copy_n.html">std::uninitialized_copy_n</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-memory-uninitialized_fill.html">std::uninitialized_fill</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-memory-uninitialized_fill_n.html">std::uninitialized_fill_n</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-unique.html">std::unique</a></span></li>
|
|
<li><span class="t-lc"><a href="cpp-algorithm-unique_copy.html">std::unique_copy</a></span></li>
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E6.96.B0.E7.AE.97.E6.B3.95">新算法</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/header/experimental/algorithm&action=edit&redlink=1" class="new" title="cpp/header/experimental/algorithm(页面不存在)"><experimental/algorithm></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/for_each&action=edit&redlink=1" class="new" title="cpp/experimental/for each(页面不存在)"><span class="t-lines"><span>for_each</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>类似 <span class="t-lc"><a href="cpp-algorithm-for_each.html">std::for_each</a></span> ,除了返回 void<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/for_each_n&action=edit&redlink=1" class="new" title="cpp/experimental/for each n(页面不存在)"><span class="t-lines"><span>for_each_n</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>应用函数对象到序列的首 n 个元素<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/header/experimental/numeric&action=edit&redlink=1" class="new" title="cpp/header/experimental/numeric(页面不存在)"><experimental/numeric></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/reduce&action=edit&redlink=1" class="new" title="cpp/experimental/reduce(页面不存在)"><span class="t-lines"><span>reduce</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-parallelism-ts t-mark-ts">(并行 TS)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>类似 <span class="t-lc"><a href="cpp-algorithm-accumulate.html">std::accumulate</a></span> ,除了不按顺序<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/exclusive_scan&action=edit&redlink=1" class="new" title="cpp/experimental/exclusive scan(页面不存在)"><span class="t-lines"><span>exclusive_scan</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>类似 <span class="t-lc"><a href="cpp-algorithm-partial_sum.html">std::partial_sum</a></span> ,从第 i 个和排除第 i 个输入元素<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/inclusive_scan&action=edit&redlink=1" class="new" title="cpp/experimental/inclusive scan(页面不存在)"><span class="t-lines"><span>inclusive_scan</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>类似 <span class="t-lc"><a href="cpp-algorithm-partial_sum.html">std::partial_sum</a></span> ,包含第 i 个元素于第 i 个和<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/transform_reduce&action=edit&redlink=1" class="new" title="cpp/experimental/transform reduce(页面不存在)"><span class="t-lines"><span>transform_reduce</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-parallelism-ts t-mark-ts">(并行 TS)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>应用函数对象,然后不按顺序规约<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/transform_exclusive_scan&action=edit&redlink=1" class="new" title="cpp/experimental/transform exclusive scan(页面不存在)"><span class="t-lines"><span>transform_exclusive_scan</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>应用函数对象,再计算 exclusive_scan<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/experimental/transform_inclusive_scan&action=edit&redlink=1" class="new" title="cpp/experimental/transform inclusive scan(页面不存在)"><span class="t-lines"><span>transform_inclusive_scan</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>应用函数对象,再计算 inclusive_scan<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|