-
Notifications
You must be signed in to change notification settings - Fork 0
/
01_Overview.html
385 lines (352 loc) · 27.4 KB
/
01_Overview.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>1 概论 — THE END of ERROR - Unum Computing 0.1 documentation</title>
<link rel="stylesheet" href="_static/material-design-lite-1.3.0/material.blue-deep_orange.min.css" type="text/css" />
<link rel="stylesheet" href="_static/sphinx_materialdesign_theme.css" type="text/css" />
<link rel="stylesheet" href="_static/fontawesome/all.css" type="text/css" />
<link rel="stylesheet" href="_static/fonts.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/basic.css" />
<link rel="stylesheet" type="text/css" href="_static/d2l.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js"></script>
<script src="_static/d2l.js"></script>
<script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="2. 构造unum的格式" href="02_BuildUpUnumFormat.html" />
<link rel="prev" title="Part 1 一种新的数字格式Unum" href="Part1.html" />
</head>
<body>
<div class="mdl-layout mdl-js-layout mdl-layout--fixed-header mdl-layout--fixed-drawer"><header class="mdl-layout__header mdl-layout__header--waterfall ">
<div class="mdl-layout__header-row">
<nav class="mdl-navigation breadcrumb">
<a class="mdl-navigation__link is-active">1 概论</a>
</nav>
<div class="mdl-layout-spacer"></div>
<nav class="mdl-navigation">
<form class="form-inline pull-sm-right" action="search.html" method="get">
<div class="mdl-textfield mdl-js-textfield mdl-textfield--expandable mdl-textfield--floating-label mdl-textfield--align-right">
<label id="quick-search-icon" class="mdl-button mdl-js-button mdl-button--icon" for="waterfall-exp">
<i class="material-icons">search</i>
</label>
<div class="mdl-textfield__expandable-holder">
<input class="mdl-textfield__input" type="text" name="q" id="waterfall-exp" placeholder="Search" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</div>
</div>
<div class="mdl-tooltip" data-mdl-for="quick-search-icon">
Quick search
</div>
</form>
<a id="button-show-source"
class="mdl-button mdl-js-button mdl-button--icon"
href="_sources/01_Overview.rst.txt" rel="nofollow">
<i class="material-icons">code</i>
</a>
<div class="mdl-tooltip" data-mdl-for="button-show-source">
Show Source
</div>
</nav>
</div>
<div class="mdl-layout__header-row header-links">
<div class="mdl-layout-spacer"></div>
<nav class="mdl-navigation">
<a class="mdl-navigation__link" href="https://github.com/jszheng/TheEndOfError">
<i class="fab fa-github"></i>
Github
</a>
</nav>
</div>
</header><header class="mdl-layout__drawer">
<!-- Title -->
<span class="mdl-layout-title">
<a class="title" href="index.html">
<span class="title-text">
THE END of ERROR - Unum Computing
</span>
</a>
</span>
<div class="globaltoc">
<span class="mdl-layout-title toc">Table Of Contents</span>
<nav class="mdl-navigation">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="Preface.html">Preface</a></li>
<li class="toctree-l1"><a class="reference internal" href="00_how_to_read.html">如何读这本书</a></li>
<li class="toctree-l1"><a class="reference internal" href="Part1.html">Part 1 一种新的数字格式Unum</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">1 概论</a></li>
<li class="toctree-l1"><a class="reference internal" href="02_BuildUpUnumFormat.html">2. 构造unum的格式</a></li>
<li class="toctree-l1"><a class="reference internal" href="03_TheOriginalSin.html">3. 计算机算术的原罪</a></li>
<li class="toctree-l1"><a class="reference internal" href="04_unum_format.html">4. 完整的unum格式定义</a></li>
<li class="toctree-l1"><a class="reference internal" href="05_hidden_scratchpads_3_layers.html">5. 隐藏的草稿本和三个层次</a></li>
<li class="toctree-l1"><a class="reference internal" href="06_info_per_bit.html">6 每个比特的信息</a></li>
<li class="toctree-l1"><a class="reference internal" href="07_fixed_size_unum_storage.html">7 定长的unum存储</a></li>
<li class="toctree-l1"><a class="reference internal" href="08_comparison_operations.html">8 比较操作</a></li>
<li class="toctree-l1"><a class="reference internal" href="09_add_sub_unbias_round.html">9 加减法和无偏差舍入的迷</a></li>
<li class="toctree-l1"><a class="reference internal" href="10_mul_div.html">10 乘法和除法</a></li>
<li class="toctree-l1"><a class="reference internal" href="11_power.html">11 求幂</a></li>
<li class="toctree-l1"><a class="reference internal" href="12_other_important_unary_ops.html">12 其他重要的一元运算</a></li>
<li class="toctree-l1"><a class="reference internal" href="13_fused_operations.html">13 融合操作(一次性表达式)</a></li>
<li class="toctree-l1"><a class="reference internal" href="14_trial_runs.html">14 试运行:Unums 面临计算挑战</a></li>
<li class="toctree-l1"><a class="reference internal" href="part1_summary.html">小结</a></li>
<li class="toctree-l1"><a class="reference internal" href="Part2.html">Part 2 - 一种新的解决方法 Ubox</a></li>
<li class="toctree-l1"><a class="reference internal" href="15_TheOtherKindOfError.html">15. 另外一种误差</a></li>
<li class="toctree-l1"><a class="reference internal" href="16_avoid_interval_arith_pitfalls.html">16 避免区间算术陷阱</a></li>
<li class="toctree-l1"><a class="reference internal" href="17_meaning_of_solve_equ.html">17 “解”方程到底是什么意思?</a></li>
<li class="toctree-l1"><a class="reference internal" href="18_permission_to_guess.html">18 准许猜测</a></li>
<li class="toctree-l1"><a class="reference internal" href="19_pendulums_done_correctly.html">19 摆的正确计算</a></li>
<li class="toctree-l1"><a class="reference internal" href="20_two_body_problem.html">20 二体问题(以及多体问题)</a></li>
<li class="toctree-l1"><a class="reference internal" href="21_calculus_evil.html">21 微积分被认为是邪恶的:离散物理</a></li>
<li class="toctree-l1"><a class="reference internal" href="22_end_of_error.html">22 错误的终结</a></li>
<li class="toctree-l1"><a class="reference internal" href="Glossary.html">词汇表</a></li>
</ul>
</nav>
</div>
</header>
<main class="mdl-layout__content" tabIndex="0">
<script type="text/javascript" src="_static/sphinx_materialdesign_theme.js "></script>
<header class="mdl-layout__drawer">
<!-- Title -->
<span class="mdl-layout-title">
<a class="title" href="index.html">
<span class="title-text">
THE END of ERROR - Unum Computing
</span>
</a>
</span>
<div class="globaltoc">
<span class="mdl-layout-title toc">Table Of Contents</span>
<nav class="mdl-navigation">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="Preface.html">Preface</a></li>
<li class="toctree-l1"><a class="reference internal" href="00_how_to_read.html">如何读这本书</a></li>
<li class="toctree-l1"><a class="reference internal" href="Part1.html">Part 1 一种新的数字格式Unum</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">1 概论</a></li>
<li class="toctree-l1"><a class="reference internal" href="02_BuildUpUnumFormat.html">2. 构造unum的格式</a></li>
<li class="toctree-l1"><a class="reference internal" href="03_TheOriginalSin.html">3. 计算机算术的原罪</a></li>
<li class="toctree-l1"><a class="reference internal" href="04_unum_format.html">4. 完整的unum格式定义</a></li>
<li class="toctree-l1"><a class="reference internal" href="05_hidden_scratchpads_3_layers.html">5. 隐藏的草稿本和三个层次</a></li>
<li class="toctree-l1"><a class="reference internal" href="06_info_per_bit.html">6 每个比特的信息</a></li>
<li class="toctree-l1"><a class="reference internal" href="07_fixed_size_unum_storage.html">7 定长的unum存储</a></li>
<li class="toctree-l1"><a class="reference internal" href="08_comparison_operations.html">8 比较操作</a></li>
<li class="toctree-l1"><a class="reference internal" href="09_add_sub_unbias_round.html">9 加减法和无偏差舍入的迷</a></li>
<li class="toctree-l1"><a class="reference internal" href="10_mul_div.html">10 乘法和除法</a></li>
<li class="toctree-l1"><a class="reference internal" href="11_power.html">11 求幂</a></li>
<li class="toctree-l1"><a class="reference internal" href="12_other_important_unary_ops.html">12 其他重要的一元运算</a></li>
<li class="toctree-l1"><a class="reference internal" href="13_fused_operations.html">13 融合操作(一次性表达式)</a></li>
<li class="toctree-l1"><a class="reference internal" href="14_trial_runs.html">14 试运行:Unums 面临计算挑战</a></li>
<li class="toctree-l1"><a class="reference internal" href="part1_summary.html">小结</a></li>
<li class="toctree-l1"><a class="reference internal" href="Part2.html">Part 2 - 一种新的解决方法 Ubox</a></li>
<li class="toctree-l1"><a class="reference internal" href="15_TheOtherKindOfError.html">15. 另外一种误差</a></li>
<li class="toctree-l1"><a class="reference internal" href="16_avoid_interval_arith_pitfalls.html">16 避免区间算术陷阱</a></li>
<li class="toctree-l1"><a class="reference internal" href="17_meaning_of_solve_equ.html">17 “解”方程到底是什么意思?</a></li>
<li class="toctree-l1"><a class="reference internal" href="18_permission_to_guess.html">18 准许猜测</a></li>
<li class="toctree-l1"><a class="reference internal" href="19_pendulums_done_correctly.html">19 摆的正确计算</a></li>
<li class="toctree-l1"><a class="reference internal" href="20_two_body_problem.html">20 二体问题(以及多体问题)</a></li>
<li class="toctree-l1"><a class="reference internal" href="21_calculus_evil.html">21 微积分被认为是邪恶的:离散物理</a></li>
<li class="toctree-l1"><a class="reference internal" href="22_end_of_error.html">22 错误的终结</a></li>
<li class="toctree-l1"><a class="reference internal" href="Glossary.html">词汇表</a></li>
</ul>
</nav>
</div>
</header>
<div class="document">
<div class="page-content" role="main">
<div class="section" id="id1">
<h1>1 概论<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
<div class="figure align-default" id="id4">
<img alt="_images/image-20200707162605636.png" src="_images/image-20200707162605636.png" />
<p class="caption"><span class="caption-number">Fig. 6 </span><span class="caption-text">image-20200707162605636</span><a class="headerlink" href="#id4" title="Permalink to this image">¶</a></p>
</div>
<center><p>“你不能把大海煮到沸腾。” —前英特尔高管对unums的想法做出的回应.</p>
</center><center><p>附带说一下unum发音是“ you-num”,并且用小写字母拼写。</p>
</center><p>The <strong>u</strong>niversal <strong>num</strong>ber (通用数字)
或’<strong>unum</strong>’包含了所有标准浮点格式(floating point),以及定点(fix
point)和精确整数运算(exact integer arithmetic)。
unum比浮点运算获得更准确的答案,且在许多情况下使用较少的位,从而节省了内存,带宽,能量和功率。
与浮点数(floats)不同,unums不会产生舍入错误,并且不会溢出或下溢。
听起来似乎用有限的位数是不可能的,但这就是unum所能做到的。
unum对于浮点数如同浮点数对于整数一样是个超集。</p>
<p><strong>unum arithmetic</strong>算术比<strong>interval
arithmetic</strong>(间隔算术)更严格,但使用的存储位却少得多。
unum计算环境可以动态地自动调整精度和动态范围,因此程序员<em>无需</em>选择要使用的精度;
因此它比浮点算术更易于使用和更安全。
与浮点数不同,unum算术保证在不同计算机上得到<em>完全逐位相同的答案</em>。
它的主要缺点是需要更多的逻辑门才能在芯片中实现,但是现代芯片可以很便宜地拥有大量逻辑门。
而<strong>内存带宽</strong>,<strong>能效比</strong>和<strong>编程人员的生产力</strong>则非常宝贵且受到限制。
unums帮助解决所有三个问题。
现在是时候用更好的东西来补充具有百年历史的浮点算法了:unum算法。</p>
<p>现在是时候煮沸海洋了。</p>
<div class="section" id="id2">
<h2>1.1 更少的比特数,更好的结果<a class="headerlink" href="#id2" title="Permalink to this heading">¶</a></h2>
<div class="figure align-default" id="id5">
<img alt="_images/image-20200707165444622.png" src="_images/image-20200707165444622.png" />
<p class="caption"><span class="caption-number">Fig. 7 </span><span class="caption-text">image-20200707165444622</span><a class="headerlink" href="#id5" title="Permalink to this image">¶</a></p>
</div>
<center><p>100岁生日快乐,浮点数。我们仍在使用为第一次世界大战时代的计算技术设计的数字格式。</p>
</center><p>用看起来像<em>科学计数法</em>(scientfic
notion)的数字进行自动计算的想法可以追溯到1914年(Leonardo Torres y
Quevado)。科学记数法将数字表示为两个部分的乘积,例如“
<span class="math notranslate nohighlight">\(6.022\times10^{23}\)</span>”,其中<span class="math notranslate nohighlight">\(6.022\)</span>是小数部分,“
<span class="math notranslate nohighlight">\(10^{23}\)</span>”中的23是指数。如果必须使用整数来表示该值,那么无论是在纸上还是在计算机系统中,它都会占用更多的空间:</p>
<div class="math notranslate nohighlight" id="equation-01-overview-0">
<span class="eqno">(2)<a class="headerlink" href="#equation-01-overview-0" title="Permalink to this equation">¶</a></span>\[602,200,000,000,000,000,000,000,000,000\]</div>
<p>指数可以为负也可以为正,因此小数点的位置可以左右浮动,以表示非常大或非常小的数字。托雷斯·奎瓦多(Torres
y Quevado)在1914年提出的在自动计算机中使用此类数字的建议,
并应用在了1941年左右(康拉德·祖斯Konrad
Zuse的Z3)机器中,其使用的是基数2(二进制)而不是基数10(十进制)。
Zuse的计算机可以存储16位分数和6位指数的数字,例如</p>
<div class="math notranslate nohighlight" id="equation-01-overview-1">
<span class="eqno">(3)<a class="headerlink" href="#equation-01-overview-1" title="Permalink to this equation">¶</a></span>\[1.0001110111010001 \times 2^{110100}\]</div>
<p>左右浮动的是“二进制点”而不是“十进制小数点”</p>
<p>但是,每台早期的计算机设计在表示浮点值和算术行为方面都各有不同。
经过数十年的不兼容之后,电气与电子工程师协会(IEEE,通常发音为“ I Triple
E”)委员会标准化了格式和1980年代中期的某些行为。 该标准称为IEEE 754。
阅读此介绍的化学家会将</p>
<div class="math notranslate nohighlight" id="equation-01-overview-2">
<span class="eqno">(4)<a class="headerlink" href="#equation-01-overview-2" title="Permalink to this equation">¶</a></span>\[6.022\times10^{23}\]</div>
<p>识别为物理常数,称为“阿伏加德罗数”,这是元素或化合物的标准原子或分子数。
化学家几乎总是坚持使用双精度(double)作为他们的计算机模拟的精度。
在IEEE双精度中,阿伏加德罗Avogadro常数的四位的近似数字看起来像是这长长的一堆比特位:</p>
<div class="math notranslate nohighlight" id="equation-01-overview-3">
<span class="eqno">(5)<a class="headerlink" href="#equation-01-overview-3" title="Permalink to this equation">¶</a></span>\[(-1)^0 \times 2^{10 001 001 101-1023} \times 1.1111111000010101010011110100010101111110101000010011\]</div>
<table border="2"><tr><td bgcolor="lightyellow"><p>令人惊讶的是,IEEE标准不要求使用相同格式的不同计算机产生相同的结果!
鼓励使用隐藏的“保护数字”(guard
digits)以提高舍入答案的准确性,即使这样做的代价是造成不同计算机系统的结果之间令人困惑的不一致。
Java编程语言的开发人员很惊讶地发现,将浮点数指定为IEEE标准并不能保证任何计算机上的结果都相同。
Java解决方法是禁用所有提高准确性的隐藏方法。</p>
</td></tr></table><p>现在,我们有几种不同的IEEE标准二进制浮点精度:16位(半精度),32位(单精度),64位(双精度)和128位(四精度)。目前程序员必须选择他们认为适合其应用程序的精度。如果选择的太少,则结果精度可能太低,或者可能动态范围不足以代表最大值和最小值(上溢和下溢)。如果他们选择了太多的精度,那么他们的应用程序将消耗不必要的存储空间,带宽,能量和运行功率,当然,运行速度也会变慢。
由于能耗或功耗限制了许多计算机-从移动设备(我们一直希望更长的电池寿命)到巨型数据中心(在可用空间或设备成本用光之前就消耗可用的兆瓦的功耗),也许是时候重新检查这个具有百年历史的浮点格式的概念,看看是否还有更好的方法。
“更好”是指:</p>
<ul class="simple">
<li><p>更易于使用</p></li>
<li><p>更准确</p></li>
<li><p>对内存和带宽的要求降低</p></li>
<li><p>更少的能源和电力消耗</p></li>
<li><p>保证在不同计算机上给出按位相同的结果</p></li>
<li><p>在大多数情况下,速度更快。</p></li>
</ul>
<p>假设我们希望以IEEE原理为基础,但是能够将精度和动态范围更改为最佳位数,并且还可以记录该数字是准确的还是在范围内,而不是四舍五入。
我们可以通过附加使数字具有自描述性的其他位字段来实现。
将此称为“通用数”或unum。</p>
<blockquote>
<div><p><strong>定义</strong>:unum是具有六个子字段的可变长度的位串:符号位,指数,分数,不确定性位,指数大小和分数大小。</p>
</div></blockquote>
<p>快速预览下unum格式的样子:</p>
<div class="figure align-default" id="id6">
<img alt="_images/image-20200707175337458.png" src="_images/image-20200707175337458.png" />
<p class="caption"><span class="caption-number">Fig. 8 </span><span class="caption-text">image-20200707175337458</span><a class="headerlink" href="#id6" title="Permalink to this image">¶</a></p>
</div>
<p>左边的三个字段类似于IEEE浮点,但具有更好的规则来表示非数字Not-a-Number(NaN)和无穷大,和处理上溢,下溢和舍入的更好方法。它用不确定性位uncertain
bit,或简称ubit(带有“ cubit”的押韵)来实现。</p>
<blockquote>
<div><p><strong>定义</strong>:ubit是unum格式的一个标志位,如果unum为精确,则为0;如果unum表示两个精确unum之间的开放间隔,则为1。</p>
</div></blockquote>
<p>ubit类似于表达式“<span class="math notranslate nohighlight">\(2\div3=0.666...\)</span>”中的“…”。这意味着在分数的最后一位之后还有更多位,不是全为0,也不是全为1,而是未指定。
ubit不会舍入,而是存储结果位于可表示的精确值之间的事实。</p>
<p>ubit还标记了值介于<strong>最大可表示实数和无穷</strong>之间,或介于<strong>最小幅度可表示数与零</strong>之间的情况。
ubit允许unum处理那种浮点数会将溢出<strong>上溢到无限</strong>或<strong>下溢到零</strong>的情况,做法是将它们视为精确定义的范围,<strong>绝不</strong>不与无穷或零混淆。简而言之,unum对它是否完全了解所表示数值是诚实的。
Unums通过将不确定性明确化并将其存储在数字自我描述中来管理不确定性。</p>
<p>最后两个字段指示指数和分数中的位数,每次计算都允许两者都改变,这很像浮点数中的每次计算改变二进制点位置的方式。
(它们的偏移量为1,因此,例如,如果指数大小的位为<span class="math notranslate nohighlight">\(010 = 2\)</span>,则指数字段的宽度为3位,小数部分的宽度也是如此。)描述该字段的位数指数大小和分数大小在环境中设置。</p>
<p>这些字段可以小到零位宽。在那种极端的情况下,所有的unum只有四位:一个符号位,一个指数位,一个小数位,以及一个ubit,指示小数是精确值还是值范围。事实证明,超短的unum位字符串是令人惊讶的强大工具。</p>
<p>那是unums的解释的快速版本。随后的各章系统地处理了unum格式。与浮点格式优于定点格式一样,unum方法将被证明比计算机通常存储实数的方式具有一些惊人的优势。一方面,与浮点数相比,unum简洁,可以节省存储空间和带宽,并降低硬件的功耗和能源需求。更重要的是,unum永远不会像浮点运算那样用数学准确的数值去代替附近的数值。他们在数学上很诚实,并且在不同的计算机上给出按位相同的答案。</p>
<p>在硬件实现中,unum数比浮点数需要更多的逻辑,但是晶体管已经变得如此便宜,以至于我们欢迎任何能够使用它们的新事物。如果计算机能够对精度和动态范围做出大多数决策而程序员再不必做了,那岂不是更好吗?</p>
</div>
<div class="section" id="id3">
<h2>1.2 为什么更好的算术可以节省功耗与面积<a class="headerlink" href="#id3" title="Permalink to this heading">¶</a></h2>
<div class="figure align-default" id="id7">
<img alt="_images/image-20200707181809976.png" src="_images/image-20200707181809976.png" />
<p class="caption"><span class="caption-number">Fig. 9 </span><span class="caption-text">image-20200707181809976</span><a class="headerlink" href="#id7" title="Permalink to this image">¶</a></p>
</div>
<blockquote>
<div><center><p>现代处理器芯片的散热结构比芯片本身大数百倍。
一个140瓦的芯片具有与电炉顶上的线圈大约相同的功率密度</p>
</center></div></blockquote>
<p>当人们被告知现代计算机上的算术使用很少的能量,而更多的能量用于移动数据时,许多人感到惊讶。
那是因为晶体管已经变得更快,更便宜且更节能,但是连接它们的导线仍然相对较慢,昂贵且低能效。
以下是2010年时代技术的一些测量结果,其中“ pJ”为皮焦耳:</p>
<table class="docutils align-default">
<colgroup>
<col style="width: 51%" />
<col style="width: 32%" />
<col style="width: 16%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>操作类型</p></th>
<th class="head"><p>近似能量消耗</p></th>
<th class="head"><p>位置</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>64b 浮点乘加</p></td>
<td><p>64 pJ</p></td>
<td><p>芯片内</p></td>
</tr>
<tr class="row-odd"><td><p>读写64b的寄存器数据</p></td>
<td><p>6 pJ</p></td>
<td><p>芯片内</p></td>
</tr>
<tr class="row-even"><td><p>从DRAM读64b数据</p></td>
<td><p>4200 pJ</p></td>
<td><p>芯片外</p></td>
</tr>
</tbody>
</table>
<p>从表上看信息很明确:大量的能量消耗是用于片外数据运动,而不是芯片内部的数学运算。</p>
<p>如果处理器具有足够的CPU核和乘法器-加法器单元,以每个时钟频率(在3
GHz频率下)执行32个浮点运算,则其总和仅为6瓦。在芯片内移动数据是相当低的功耗,因为这些线是及其细微的,但是在外部DRAM之间来回移动数据意味着需要驱动人眼可见的芯片之间连线,功耗相比是巨大的。这就是为什么将双精度浮点数移动到处理器中所需的能量是执行乘法和加法所需的能量的60倍以上。随着晶体管的改进,该比率还在增加。</p>
<p>打个比方:假设您购买了汽车保险,但您不知道自己的汽车值多少钱。因此,您做出保守的猜测,并声明这辆汽车的价值是其实际价值的十倍,只是为了确保您在发生事故的情况下得到了保障。后来却因为收到了让人吃惊的高昂费用帐单而感到愤怒。</p>
<p>计算机用户要求计算机来回移动十五位的十进制数字也是对灾难的过度保险。用户不知道所需的小数位数是多少,因此他们要求太多。然后他们感到愤怒的是程序运行速度太慢并且消耗了太多的电能。</p>
<p>这里的目的不是要劝说计算机用户在评估其精度需求方面做得更好。他们本不应该去做这样的工作。他们应该指定输入值的精度以及希望在输出值的精度。要求双精度或任何精度,都是混淆了手段与目标。计算机应管理自己的精度需求以达到要求的精度目标,它可以比任何程序员都做得更好。但是首先,计算机需要一种数字格式,使其能够达到这个目的。</p>
</div>
</div>
</div>
<div class="side-doc-outline">
<div class="side-doc-outline--content">
<div class="localtoc">
<p class="caption">
<span class="caption-text">Table Of Contents</span>
</p>
<ul>
<li><a class="reference internal" href="#">1 概论</a><ul>
<li><a class="reference internal" href="#id2">1.1 更少的比特数,更好的结果</a></li>
<li><a class="reference internal" href="#id3">1.2 为什么更好的算术可以节省功耗与面积</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div><div class="pagenation">
<a id="button-prev" href="Part1.html" class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--colored" role="botton" accesskey="P">
<i class="pagenation-arrow-L fas fa-arrow-left fa-lg"></i>
<div class="pagenation-text">
<span class="pagenation-direction">Previous</span>
<div>Part 1 一种新的数字格式Unum</div>
</div>
</a>
<a id="button-next" href="02_BuildUpUnumFormat.html" class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--colored" role="botton" accesskey="N">
<i class="pagenation-arrow-R fas fa-arrow-right fa-lg"></i>
<div class="pagenation-text">
<span class="pagenation-direction">Next</span>
<div>2. 构造unum的格式</div>
</div>
</a>
</div>
</main>
</div>
</body>
</html>