250 lines
27 KiB
HTML
250 lines
27 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>std::hardware_destructive_interference_size, std::hardware_constructive_interference_size</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_thread_hardware_destructive_interference_size skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::</span>hardware_destructive_interference_size, <span style="font-size:0.7em; line-height:130%">std::</span>hardware_constructive_interference_size</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-thread.html">thread</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-new.html"><new></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">inline</span> <span class="kw4">constexpr</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><br />
|
|
hardware_destructive_interference_size <span class="sy1">=</span> <span class="coMULTI">/*implementation-defined*/</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(1)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">inline</span> <span class="kw4">constexpr</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><br />
|
|
hardware_constructive_interference_size <span class="sy1">=</span> <span class="coMULTI">/*implementation-defined*/</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 二个对象间避免假数据共享的最小偏移。保证至少为 <span class="t-c"><span class="mw-geshi cpp source-cpp">alignof<span class="br0">(</span><a href="cpp-types-max_align_t.html"><span class="kw104">std::<span class="me2">max_align_t</span></span></a><span class="br0">)</span></span></span>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">struct</span> keep_apart <span class="br0">{</span>
|
|
alignas<span class="br0">(</span>std<span class="sy4">::</span><span class="me2">hardware_destructive_interference_size</span><span class="br0">)</span> <a href="cpp-atomic-atomic.html"><span class="kw2066">std::<span class="me2">atomic</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span> cat<span class="sy4">;</span>
|
|
alignas<span class="br0">(</span>std<span class="sy4">::</span><span class="me2">hardware_destructive_interference_size</span><span class="br0">)</span> <a href="cpp-atomic-atomic.html"><span class="kw2066">std::<span class="me2">atomic</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span> dog<span class="sy4">;</span>
|
|
<span class="br0">}</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 鼓励真共享的最大连续内存大小。保证至少为 <span class="t-c"><span class="mw-geshi cpp source-cpp">alignof<span class="br0">(</span><a href="cpp-types-max_align_t.html"><span class="kw104">std::<span class="me2">max_align_t</span></span></a><span class="br0">)</span></span></span>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">struct</span> together <span class="br0">{</span>
|
|
<a href="cpp-atomic-atomic.html"><span class="kw2066">std::<span class="me2">atomic</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span> dog<span class="sy4">;</span>
|
|
<span class="kw4">int</span> puppy<span class="sy4">;</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> kennel <span class="br0">{</span>
|
|
<span class="co1">// 其他数据成员……</span>
|
|
alignas<span class="br0">(</span>sizeof<span class="br0">(</span>together<span class="br0">)</span><span class="br0">)</span> together pack<span class="sy4">;</span>
|
|
<span class="co1">// 其他数据成员……</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
static_assert<span class="br0">(</span>sizeof<span class="br0">(</span>together<span class="br0">)</span> <span class="sy1"><=</span> std<span class="sy4">::</span><span class="me2">hardware_constructive_interference_size</span><span class="br0">)</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>这些常量提供一种可移植的访问 L1 数据缓存线大小的方式。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<p>程序使用二个线程(原子地)写入给定全局对象的数据成员。第一个对象适合一条缓存线,这导致“硬件干涉”。第二个对象保持其数据成员在分离的缓存线上,故避免了线程写入后可能的“缓存同步”。</p>
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <atomic></span>
|
|
<span class="co2">#include <chrono></span>
|
|
<span class="co2">#include <cstddef></span>
|
|
<span class="co2">#include <iomanip></span>
|
|
<span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <mutex></span>
|
|
<span class="co2">#include <new></span>
|
|
<span class="co2">#include <thread></span>
|
|
|
|
<span class="co2">#ifdef __cpp_lib_hardware_interference_size</span>
|
|
<span class="kw1">using</span> std<span class="sy4">::</span><span class="me2">hardware_constructive_interference_size</span><span class="sy4">;</span>
|
|
<span class="kw1">using</span> std<span class="sy4">::</span><span class="me2">hardware_destructive_interference_size</span><span class="sy4">;</span>
|
|
<span class="co2">#else</span>
|
|
<span class="co1">// 在 x86-64 │ L1_CACHE_BYTES │ L1_CACHE_SHIFT │ __cacheline_aligned │ ... 上为 64 字节</span>
|
|
<span class="kw4">constexpr</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> hardware_constructive_interference_size <span class="sy1">=</span> <span class="nu0">64</span><span class="sy4">;</span>
|
|
<span class="kw4">constexpr</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> hardware_destructive_interference_size <span class="sy1">=</span> <span class="nu0">64</span><span class="sy4">;</span>
|
|
<span class="co2">#endif</span>
|
|
|
|
<a href="cpp-thread-mutex.html"><span class="kw2152">std::<span class="me2">mutex</span></span></a> cout_mutex<span class="sy4">;</span>
|
|
|
|
<span class="kw4">constexpr</span> <span class="kw4">int</span> max_write_iterations<span class="br0">{</span><span class="nu0">10</span><span class="st0">'000'</span><span class="nu8">000</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 性能评估时间调节</span>
|
|
|
|
<span class="kw1">struct</span> alignas<span class="br0">(</span>hardware_constructive_interference_size<span class="br0">)</span>
|
|
OneCacheLiner <span class="br0">{</span> <span class="co1">// 占据一条缓存线</span>
|
|
<a href="cpp-atomic-atomic.html"><span class="kw2123">std::<span class="me2">atomic_uint64_t</span></span></a> x<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="cpp-atomic-atomic.html"><span class="kw2123">std::<span class="me2">atomic_uint64_t</span></span></a> y<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="br0">}</span> oneCacheLiner<span class="sy4">;</span>
|
|
|
|
<span class="kw1">struct</span> TwoCacheLiner <span class="br0">{</span> <span class="co1">// 占据二条缓存线</span>
|
|
alignas<span class="br0">(</span>hardware_destructive_interference_size<span class="br0">)</span> <a href="cpp-atomic-atomic.html"><span class="kw2123">std::<span class="me2">atomic_uint64_t</span></span></a> x<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
|
|
alignas<span class="br0">(</span>hardware_destructive_interference_size<span class="br0">)</span> <a href="cpp-atomic-atomic.html"><span class="kw2123">std::<span class="me2">atomic_uint64_t</span></span></a> y<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="br0">}</span> twoCacheLiner<span class="sy4">;</span>
|
|
|
|
<span class="kw1">inline</span> <span class="kw4">auto</span> now<span class="br0">(</span><span class="br0">)</span> <span class="kw1">noexcept</span> <span class="br0">{</span> <span class="kw1">return</span> std<span class="sy4">::</span><span class="me2">chrono</span><span class="sy4">::</span><span class="me2">high_resolution_clock</span><span class="sy4">::</span><span class="me2">now</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span>
|
|
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw4">bool</span> xy<span class="sy1">></span>
|
|
<span class="kw4">void</span> oneCacheLinerThread<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw4">const</span> <span class="kw4">auto</span> start <span class="br0">{</span> now<span class="br0">(</span><span class="br0">)</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw1">for</span> <span class="br0">(</span>uint64_t count<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> count <span class="sy3">!</span><span class="sy1">=</span> max_write_iterations<span class="sy4">;</span> <span class="sy2">++</span>count<span class="br0">)</span>
|
|
<span class="kw1">if</span> <span class="kw4">constexpr</span> <span class="br0">(</span>xy<span class="br0">)</span>
|
|
oneCacheLiner.<span class="me1">x</span>.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, <a href="cpp-atomic-memory_order.html"><span class="kw2093">std::<span class="me2">memory_order_relaxed</span></span></a><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw1">else</span> oneCacheLiner.<span class="me1">y</span>.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, <a href="cpp-atomic-memory_order.html"><span class="kw2093">std::<span class="me2">memory_order_relaxed</span></span></a><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">const</span> <a href="cpp-chrono-duration.html"><span class="kw993">std::<span class="me2">chrono</span><span class="sy4">::</span><span class="me2">duration</span></span></a><span class="sy1"><</span><span class="kw4">double</span>, <a href="cpp-numeric-ratio-ratio.html"><span class="kw1528">std::<span class="me2">milli</span></span></a><span class="sy1">></span> elapsed <span class="br0">{</span> now<span class="br0">(</span><span class="br0">)</span> <span class="sy2">-</span> start <span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="cpp-thread-lock_guard.html"><span class="kw2164">std::<span class="me2">lock_guard</span></span></a> lk<span class="br0">{</span>cout_mutex<span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"oneCacheLinerThread() spent "</span> <span class="sy1"><<</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">" ms<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="kw1">if</span> <span class="kw4">constexpr</span> <span class="br0">(</span>xy<span class="br0">)</span>
|
|
oneCacheLiner.<span class="me1">x</span> <span class="sy1">=</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw1">else</span> oneCacheLiner.<span class="me1">y</span> <span class="sy1">=</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw4">bool</span> xy<span class="sy1">></span>
|
|
<span class="kw4">void</span> twoCacheLinerThread<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw4">const</span> <span class="kw4">auto</span> start <span class="br0">{</span> now<span class="br0">(</span><span class="br0">)</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw1">for</span> <span class="br0">(</span>uint64_t count<span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> count <span class="sy3">!</span><span class="sy1">=</span> max_write_iterations<span class="sy4">;</span> <span class="sy2">++</span>count<span class="br0">)</span>
|
|
<span class="kw1">if</span> <span class="kw4">constexpr</span> <span class="br0">(</span>xy<span class="br0">)</span>
|
|
twoCacheLiner.<span class="me1">x</span>.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, <a href="cpp-atomic-memory_order.html"><span class="kw2093">std::<span class="me2">memory_order_relaxed</span></span></a><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw1">else</span> twoCacheLiner.<span class="me1">y</span>.<span class="me1">fetch_add</span><span class="br0">(</span><span class="nu0">1</span>, <a href="cpp-atomic-memory_order.html"><span class="kw2093">std::<span class="me2">memory_order_relaxed</span></span></a><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">const</span> <a href="cpp-chrono-duration.html"><span class="kw993">std::<span class="me2">chrono</span><span class="sy4">::</span><span class="me2">duration</span></span></a><span class="sy1"><</span><span class="kw4">double</span>, <a href="cpp-numeric-ratio-ratio.html"><span class="kw1528">std::<span class="me2">milli</span></span></a><span class="sy1">></span> elapsed <span class="br0">{</span> now<span class="br0">(</span><span class="br0">)</span> <span class="sy2">-</span> start <span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="cpp-thread-lock_guard.html"><span class="kw2164">std::<span class="me2">lock_guard</span></span></a> lk<span class="br0">{</span>cout_mutex<span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"twoCacheLinerThread() spent "</span> <span class="sy1"><<</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">" ms<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="kw1">if</span> <span class="kw4">constexpr</span> <span class="br0">(</span>xy<span class="br0">)</span>
|
|
twoCacheLiner.<span class="me1">x</span> <span class="sy1">=</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw1">else</span> twoCacheLiner.<span class="me1">y</span> <span class="sy1">=</span> elapsed.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"__cpp_lib_hardware_interference_size "</span>
|
|
<span class="co2"># ifdef __cpp_lib_hardware_interference_size</span>
|
|
<span class="st0">" = "</span> <span class="sy1"><<</span> __cpp_lib_hardware_interference_size <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="co2"># else</span>
|
|
<span class="st0">"is not defined, use 64 as fallback<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="co2"># endif</span>
|
|
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a>
|
|
<span class="sy1"><<</span> <span class="st0">"hardware_destructive_interference_size == "</span>
|
|
<span class="sy1"><<</span> hardware_destructive_interference_size <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"hardware_constructive_interference_size == "</span>
|
|
<span class="sy1"><<</span> hardware_constructive_interference_size <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span><span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a>
|
|
<span class="sy1"><<</span> <a href="cpp-io-manip-fixed.html"><span class="kw1784">std::<span class="me2">fixed</span></span></a> <span class="sy1"><<</span> <a href="cpp-io-manip-setprecision.html"><span class="kw1796">std::<span class="me2">setprecision</span></span></a><span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span>
|
|
<span class="sy1"><<</span> <span class="st0">"sizeof( OneCacheLiner ) == "</span> <span class="sy1"><<</span> sizeof<span class="br0">(</span> OneCacheLiner <span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"sizeof( TwoCacheLiner ) == "</span> <span class="sy1"><<</span> sizeof<span class="br0">(</span> TwoCacheLiner <span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span><span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">constexpr</span> <span class="kw4">int</span> max_runs<span class="br0">{</span><span class="nu0">4</span><span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span> oneCacheLiner_average<span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">auto</span> i<span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span> i <span class="sy3">!</span><span class="sy1">=</span> max_runs<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-thread-thread.html"><span class="kw2146">std::<span class="me2">thread</span></span></a> th1<span class="br0">{</span>oneCacheLinerThread<span class="sy1"><</span><span class="nu0">0</span><span class="sy1">></span><span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="cpp-thread-thread.html"><span class="kw2146">std::<span class="me2">thread</span></span></a> th2<span class="br0">{</span>oneCacheLinerThread<span class="sy1"><</span><span class="nu0">1</span><span class="sy1">></span><span class="br0">}</span><span class="sy4">;</span>
|
|
th1.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> th2.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
oneCacheLiner_average <span class="sy2">+</span><span class="sy1">=</span> oneCacheLiner.<span class="me1">x</span> <span class="sy2">+</span> oneCacheLiner.<span class="me1">y</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Average time: "</span> <span class="sy1"><<</span> <span class="br0">(</span>oneCacheLiner_average <span class="sy2">/</span> max_runs <span class="sy2">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">" ms<span class="es1">\n</span><span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span> twoCacheLiner_average<span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">auto</span> i<span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span> i <span class="sy3">!</span><span class="sy1">=</span> max_runs<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-thread-thread.html"><span class="kw2146">std::<span class="me2">thread</span></span></a> th1<span class="br0">{</span>twoCacheLinerThread<span class="sy1"><</span><span class="nu0">0</span><span class="sy1">></span><span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="cpp-thread-thread.html"><span class="kw2146">std::<span class="me2">thread</span></span></a> th2<span class="br0">{</span>twoCacheLinerThread<span class="sy1"><</span><span class="nu0">1</span><span class="sy1">></span><span class="br0">}</span><span class="sy4">;</span>
|
|
th1.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> th2.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
twoCacheLiner_average <span class="sy2">+</span><span class="sy1">=</span> twoCacheLiner.<span class="me1">x</span> <span class="sy2">+</span> twoCacheLiner.<span class="me1">y</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Average time: "</span> <span class="sy1"><<</span> <span class="br0">(</span>twoCacheLiner_average <span class="sy2">/</span> max_runs <span class="sy2">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">" ms<span class="es1">\n</span><span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">__cpp_lib_hardware_interference_size is not defined, use 64 as fallback
|
|
hardware_destructive_interference_size == 64
|
|
hardware_constructive_interference_size == 64
|
|
|
|
sizeof( OneCacheLiner ) == 64
|
|
sizeof( TwoCacheLiner ) == 128
|
|
|
|
oneCacheLinerThread() spent 634.25 ms
|
|
oneCacheLinerThread() spent 651.55 ms
|
|
oneCacheLinerThread() spent 990.23 ms
|
|
oneCacheLinerThread() spent 1033.94 ms
|
|
oneCacheLinerThread() spent 838.14 ms
|
|
oneCacheLinerThread() spent 883.25 ms
|
|
oneCacheLinerThread() spent 873.02 ms
|
|
oneCacheLinerThread() spent 914.26 ms
|
|
Average time: 852 ms
|
|
|
|
twoCacheLinerThread() spent 119.22 ms
|
|
twoCacheLinerThread() spent 127.91 ms
|
|
twoCacheLinerThread() spent 114.17 ms
|
|
twoCacheLinerThread() spent 126.41 ms
|
|
twoCacheLinerThread() spent 125.17 ms
|
|
twoCacheLinerThread() spent 126.06 ms
|
|
twoCacheLinerThread() spent 117.94 ms
|
|
twoCacheLinerThread() spent 129.03 ms
|
|
Average time: 122 ms</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-thread-thread-hardware_concurrency.html"><span class="t-lines"><span>hardware_concurrency</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-cmark">[静态]</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>返回实现支持的并发线程数<br />
|
|
<span class="t-mark">(<code>std::thread</code> 的公开静态成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-thread-jthread-hardware_concurrency.html"><span class="t-lines"><span>hardware_concurrency</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-cmark">[静态]</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>返回实现支持的并发线程数<br />
|
|
<span class="t-mark">(<code>std::jthread</code> 的公开静态成员函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|