-
Notifications
You must be signed in to change notification settings - Fork 0
/
pim_temp.html
617 lines (570 loc) · 49.8 KB
/
pim_temp.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
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color: #ffffff; --text-color: #333333; --select-text-bg-color: #B5D6FC; --select-text-font-color: auto; --monospace: "Lucida Console",Consolas,"Courier",monospace; --title-bar-height: 20px; }
.mac-os-11 { --title-bar-height: 28px; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
h1, h2, h3, h4, h5 { white-space: pre-wrap; }
body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
.typora-export .task-list-item input { pointer-events: none; }
@media screen and (max-width: 500px) {
body.typora-export { padding-left: 0px; padding-right: 0px; }
#write { padding-left: 20px; padding-right: 20px; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px; }
thead, tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
svg { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li blockquote { margin: 1rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
#write { margin-top: 0px; border-color: transparent !important; padding-top: 0px !important; padding-bottom: 0px !important; }
.typora-export * { -webkit-print-color-adjust: exact; }
.typora-export #write { break-after: avoid; }
.typora-export #write::after { height: 0px; }
.is-mac table { break-inside: avoid; }
#write > p:nth-child(1) { margin-top: 0px; }
.typora-export-show-outline .typora-export-sidebar { display: none; }
figure { overflow-x: visible; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
.MathJax_ref { fill: currentcolor; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.reversefootnote { font-family: ui-monospace, sans-serif; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.6; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
.md-expand mark .md-meta { opacity: 0.3 !important; }
mark .md-meta { color: rgb(0, 0, 0); }
@media print {
.typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
}
.md-diagram-panel .messageText { stroke: none !important; }
.md-diagram-panel .start-state { fill: var(--node-fill); }
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
.md-fences.md-fences-math { font-size: 1em; }
.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }
.md-fences-advanced:not(.md-focus) { background: inherit; }
.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }
.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }
.typora-export-show-outline #write { --webkit-flex: 2; flex: 2 1 0%; }
.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }
@media screen and (max-width: 1024px) {
.typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }
}
@media screen and (max-width: 800px) {
.typora-export-sidebar { display: none; }
}
.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; overflow-wrap: anywhere; }
.outline-content ul { margin-top: 0px; margin-bottom: 0px; }
.outline-content strong { font-weight: 400; }
.outline-expander { width: 1rem; height: 1.42857rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }
.outline-expander::before { content: ""; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }
.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }
.outline-expander:hover::before { content: ""; }
.outline-h1 > .outline-item { padding-left: 0px; }
.outline-h2 > .outline-item { padding-left: 1em; }
.outline-h3 > .outline-item { padding-left: 2em; }
.outline-h4 > .outline-item { padding-left: 3em; }
.outline-h5 > .outline-item { padding-left: 4em; }
.outline-h6 > .outline-item { padding-left: 5em; }
.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }
.outline-label:hover { text-decoration: underline; }
.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }
.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left: 28px solid transparent; border-right: 28px solid transparent; }
.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }
.outline-item-open > .outline-item > .outline-expander::before { content: ""; }
.outline-children { display: none; }
.info-panel-tab-wrapper { display: none; }
.outline-item-open > .outline-children { display: block; }
.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }
.typora-export .outline-item:hover { margin-right: -8px; border-right: 8px solid transparent; }
.typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; }
.typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: "−"; }
.typora-export-collapse-outline .outline-children { display: none; }
.typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }
.typora-export-no-collapse-outline .outline-expander::before { content: "" !important; }
.typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; }
.md-inline-math-container mjx-container { zoom: 0.95; }
mjx-container { break-inside: avoid; }
.md-alert.md-alert-note { border-left-color: rgb(9, 105, 218); }
.md-alert.md-alert-important { border-left-color: rgb(130, 80, 223); }
.md-alert.md-alert-warning { border-left-color: rgb(154, 103, 0); }
.md-alert.md-alert-tip { border-left-color: rgb(31, 136, 61); }
.md-alert.md-alert-caution { border-left-color: rgb(207, 34, 46); }
.md-alert { padding: 0px 1em; margin-bottom: 16px; color: inherit; border-left: 0.25em solid rgb(0, 0, 0); }
.md-alert-text-note { color: rgb(9, 105, 218); }
.md-alert-text-important { color: rgb(130, 80, 223); }
.md-alert-text-warning { color: rgb(154, 103, 0); }
.md-alert-text-tip { color: rgb(31, 136, 61); }
.md-alert-text-caution { color: rgb(207, 34, 46); }
.md-alert-text { font-size: 0.9rem; font-weight: 700; }
.md-alert-text svg { fill: currentcolor; position: relative; top: 0.125em; margin-right: 1ch; overflow: visible; }
.md-alert-text-container::after { content: attr(data-text); text-transform: capitalize; pointer-events: none; margin-right: 1ch; }
:root {
--side-bar-bg-color: #fafafa;
--control-text-color: #777;
}
@include-when-export url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);
/* open-sans-regular - latin-ext_latin */
/* open-sans-italic - latin-ext_latin */
/* open-sans-700 - latin-ext_latin */
/* open-sans-700italic - latin-ext_latin */
html {
font-size: 16px;
-webkit-font-smoothing: antialiased;
}
body {
font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, 'Segoe UI Emoji', sans-serif;
color: rgb(51, 51, 51);
line-height: 1.6;
}
#write {
max-width: 860px;
margin: 0 auto;
padding: 30px;
padding-bottom: 100px;
}
@media only screen and (min-width: 1400px) {
#write {
max-width: 1024px;
}
}
@media only screen and (min-width: 1800px) {
#write {
max-width: 1200px;
}
}
#write > ul:first-child,
#write > ol:first-child{
margin-top: 30px;
}
a {
color: #4183C4;
}
h1,
h2,
h3,
h4,
h5,
h6 {
position: relative;
margin-top: 1rem;
margin-bottom: 1rem;
font-weight: bold;
line-height: 1.4;
cursor: text;
}
h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {
text-decoration: none;
}
h1 tt,
h1 code {
font-size: inherit;
}
h2 tt,
h2 code {
font-size: inherit;
}
h3 tt,
h3 code {
font-size: inherit;
}
h4 tt,
h4 code {
font-size: inherit;
}
h5 tt,
h5 code {
font-size: inherit;
}
h6 tt,
h6 code {
font-size: inherit;
}
h1 {
font-size: 2.25em;
line-height: 1.2;
border-bottom: 1px solid #eee;
}
h2 {
font-size: 1.75em;
line-height: 1.225;
border-bottom: 1px solid #eee;
}
/*@media print {
.typora-export h1,
.typora-export h2 {
border-bottom: none;
padding-bottom: initial;
}
.typora-export h1::after,
.typora-export h2::after {
content: "";
display: block;
height: 100px;
margin-top: -96px;
border-top: 1px solid #eee;
}
}*/
h3 {
font-size: 1.5em;
line-height: 1.43;
}
h4 {
font-size: 1.25em;
}
h5 {
font-size: 1em;
}
h6 {
font-size: 1em;
color: #777;
}
p,
blockquote,
ul,
ol,
dl,
table{
margin: 0.8em 0;
}
li>ol,
li>ul {
margin: 0 0;
}
hr {
height: 2px;
padding: 0;
margin: 16px 0;
background-color: #e7e7e7;
border: 0 none;
overflow: hidden;
box-sizing: content-box;
}
li p.first {
display: inline-block;
}
ul,
ol {
padding-left: 30px;
}
ul:first-child,
ol:first-child {
margin-top: 0;
}
ul:last-child,
ol:last-child {
margin-bottom: 0;
}
blockquote {
border-left: 4px solid #dfe2e5;
padding: 0 15px;
color: #777777;
}
blockquote blockquote {
padding-right: 0;
}
table {
padding: 0;
word-break: initial;
}
table tr {
border: 1px solid #dfe2e5;
margin: 0;
padding: 0;
}
table tr:nth-child(2n),
thead {
background-color: #f8f8f8;
}
table th {
font-weight: bold;
border: 1px solid #dfe2e5;
border-bottom: 0;
margin: 0;
padding: 6px 13px;
}
table td {
border: 1px solid #dfe2e5;
margin: 0;
padding: 6px 13px;
}
table th:first-child,
table td:first-child {
margin-top: 0;
}
table th:last-child,
table td:last-child {
margin-bottom: 0;
}
.CodeMirror-lines {
padding-left: 4px;
}
.code-tooltip {
box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
border-top: 1px solid #eef2f2;
}
.md-fences,
code,
tt {
border: 1px solid #e7eaed;
background-color: #f8f8f8;
border-radius: 3px;
padding: 0;
padding: 2px 4px 0px 4px;
font-size: 0.9em;
}
code {
background-color: #f3f4f4;
padding: 0 2px 0 2px;
}
.md-fences {
margin-bottom: 15px;
margin-top: 15px;
padding-top: 8px;
padding-bottom: 6px;
}
.md-task-list-item > input {
margin-left: -1.3em;
}
@media print {
html {
font-size: 13px;
}
pre {
page-break-inside: avoid;
word-wrap: break-word;
}
}
.md-fences {
background-color: #f8f8f8;
}
#write pre.md-meta-block {
padding: 1rem;
font-size: 85%;
line-height: 1.45;
background-color: #f7f7f7;
border: 0;
border-radius: 3px;
color: #777777;
margin-top: 0 !important;
}
.mathjax-block>.code-tooltip {
bottom: .375rem;
}
.md-mathjax-midline {
background: #fafafa;
}
#write>h3.md-focus:before{
left: -1.5625rem;
top: .375rem;
}
#write>h4.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h5.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h6.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
.md-image>.md-meta {
/*border: 1px solid #ddd;*/
border-radius: 3px;
padding: 2px 0px 0px 4px;
font-size: 0.9em;
color: inherit;
}
.md-tag {
color: #a7a7a7;
opacity: 1;
}
.md-toc {
margin-top:20px;
padding-bottom:20px;
}
.sidebar-tabs {
border-bottom: none;
}
#typora-quick-open {
border: 1px solid #ddd;
background-color: #f8f8f8;
}
#typora-quick-open-item {
background-color: #FAFAFA;
border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
border-style: solid;
border-width: 1px;
}
/** focus mode */
.on-focus-mode blockquote {
border-left-color: rgba(85, 85, 85, 0.12);
}
header, .context-menu, .megamenu-content, footer{
font-family: "Segoe UI", "Arial", sans-serif;
}
.file-node-content:hover .file-node-icon,
.file-node-content:hover .file-node-open-state{
visibility: visible;
}
.mac-seamless-mode #typora-sidebar {
background-color: #fafafa;
background-color: var(--side-bar-bg-color);
}
.mac-os #write{
caret-color: AccentColor;
}
.md-lang {
color: #b4654d;
}
/*.html-for-mac {
--item-hover-bg-color: #E6F0FE;
}*/
#md-notification .btn {
border: 0;
}
.dropdown-menu .divider {
border-color: #e5e5e5;
opacity: 0.4;
}
.ty-preferences .window-content {
background-color: #fafafa;
}
.ty-preferences .nav-group-item.active {
color: white;
background: #999;
}
.menu-item-container a.menu-style-btn {
background-color: #f5f8fa;
background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0));
}
</style><title>pim</title>
</head>
<body class='typora-export os-windows'><div class='typora-export-content'>
<div id='write' class=''><h1 id='存内计算近数据处理'><span>存内计算/近数据处理</span></h1><hr /><p><strong><span>参考文献</span></strong><span>: </span><strong><span>A Modern Primer on Processing in Memory</span></strong></p><p><strong><span>作者</span></strong><span>: </span><strong><span>Onur Mutlu</span></strong><span> 【ETH Zurich / Carnegie Mellon University】</span></p><p><span> </span><span> </span><strong><span>Saugata Ghose</span></strong><span> 【Carnegie Mellon University / University of Illinois at Urbana-Champaign】</span></p><p><span> </span><span> </span><strong><span>Juan Gomez-Luna</span></strong><span>【ETH Zurich】</span></p><p><span> </span><span> </span><strong><span>Rachata Ausavarungnirun</span></strong><span> 【King Mongkut’s University of Technology North Bangkok】</span></p><p> </p><hr /><h2 id='introduction'><span>Introduction</span></h2><p><span>主存,使用动态随机存取存储器(DRAM)技术构建,是几乎所有计算系统的主要组件,包括服务器、云平台、移动/嵌入式设备和传感器系统。在所有这些系统中,现代应用程序的数据工作集的大小正在迅速增长,而对此类数据的快速分析的需求也在不断增加。因此,主存正在各种计算系统和应用程序中成为一个越来越重要的瓶颈。缓解主存瓶颈需要有效地提高内存容量、能源、成本和性能。不幸的是,近年来,特别是在过去的十年里,要扩展所有这些维度变得越来越困难,因此主存瓶颈正在恶化。</span></p><p><span>造成主存瓶颈的一个主要原因是与数据移动相关的高能量和延迟成本。在现代计算机中,要对驻留在主存中的数据执行任何操作,处理器必须从主存中检索数据。这就要求内存控制器通过一个相对缓慢且耗电的芯片外总线(称为内存通道memory channel)向DRAM模块发出命令。DRAM模块通过内存通道发送所请求的数据,然后将数据放在缓存和寄存器中。一旦数据在其寄存器中,CPU就可以对数据执行计算。</span><strong><span>从DRAM移动到CPU的数据会导致很长时间的延迟,并消耗大量的能量</span></strong><span>。CPU 没有重用带到缓存中的许多数据,这对高延迟和能源成本没有什么好处。</span></p><p><strong><span>数据移动的成本</span></strong><span>是当代计算机系统中</span><strong><span>以处理器为中心</span></strong><span>的一个基本问题。CPU被认为是系统中的master,计算只在处理器(和加速器)中执行。相比之下,数据存储和通信单元,包括主存储器,被视为无法计算的不智能的工人。由于这种</span><strong><span>以处理器为中心的设计范式,数据在系统中的计算单元和通信/存储单元之间大量移动</span></strong><span>,以便可以在其上进行计算。随着当代和新兴的应用程序日益以数据为中心的本质,以处理器为中心的设计范例导致了在性能、能源和成本方面的巨大低效。</span></p><p><span>例如,单个计算节点内的大部分real estate已经专门用于处理数据移动和存储(例如,大型缓存、内存控制器、互连和主存),我们最近的工作表明,移动设备超过</span><strong><span>62%</span></strong><span>的整个系统能量用于广泛使用的移动工作负载的处理器和存储器层次之间的</span><strong><span>数据移动</span></strong></p><p><span>现代系统中数据移动的巨大开销,以及技术的进步,使内存和逻辑能够更好地集成,最近促使人们重新审视一个旧的想法,我们通常称之为</span><strong><span>存内计算</span></strong><span>(processing-in-memory,PIM)。关</span><strong><span>键思想是将计算机制放置在数据存储处或附近</span></strong><span>(即存储器芯片内部、3d堆叠存储器的逻辑层、存储器控制器中或大缓存内部),以便与当代以处理器为中心的系统相比,在完成计算和存储数据之间的数据移动减少或消除。</span><strong><span>processing-in-memory,也称为近数据处理(NDP</span></strong><span>),它能够使用</span><strong><span>(1)内存本身</span></strong><span> 或 (2)</span><strong><span>内存子系统内部的某种形式的处理逻辑</span></strong><span>(如加速器、简单内核、可重构逻辑)来执行操作和执行软件任务</span></p><p><span>PIM的想法已经存在了至少50年。然而,由于各种原因,过去的努力并没有被广泛采用,包括</span><strong><span>1)将处理元素与DRAM集成的困难</span></strong><span>,</span><strong><span>2)缺乏当前技术和应用程序所面临的与内存相关的关键扩展挑战</span></strong><span>,和3)</span><strong><span>数据移动瓶颈对系统成本、能源和性能并不像今天那么重要</span></strong><span>。由于现代内存体系结构的进步,例如,以3d堆叠的方式将逻辑和内存进行集成,最近的各种工作探索了一系列具有多个不同目的的PIM体系结构。我们认为,以新的视角(即新的方法和想法),利用新的内存技术,以现实的工作负载和系统的方式和简化采用和可行性的心态,重新检查PIM是至关重要的。</span></p><p><span>在本章中,我们将探讨在现代系统中实现内存中处理的两种新方法。第一种方法</span><strong><span>最小限度地改变内存芯片</span></strong><span>,以执行简单而强大的通用操作,这些操作本身效率高,或者可以在执行。我们将这种方法称为</span><strong><span>PUM</span></strong><span> (processing using memory) 。属于这种方法的一些解决方案利用现有的DRAM设计,使用DRAM的模拟操作原理巧妙而有效地执行批量操作(即操作整个行DRAM单元),如批量复制、数据初始化和位操作。其他解决方案利用新兴的非易失性存储器技术的模拟操作原理来执行类似的批量操作或其他专门的计算,如卷积和矩阵乘法。</span></p><p><span>第二种方法</span><strong><span>通过利用传统存储器控制器或相对较新的3d堆叠存储器技术的逻辑层)中的计算能力</span></strong><span>,以更通用的方式实现PIM。我们称这种接近内存的处理的一般方法为。这种方法特别受到3d堆叠存储技术的推动,该技术包括存储层下的逻辑处理层。为了堆叠多层存储器,3d堆叠芯片使用垂直通过硅孔(TSVs)将各层相互连接,并连接到芯片的I/O驱动器。tsv在3D堆栈层内提供了比内存通道外部更大的内部带宽。一些这样的3d堆叠内存架构,如混合内存立方体HMC和高带宽内存HBM,包括一个逻辑层,在那里设计师可以添加一些处理逻辑(例如,加速器,简单的核心,可重新配置的逻辑)来利用这种高内部带宽。未来的die堆叠技术,如</span><em><span>monolithic 3D</span></em><span> ,可以通过极大地</span><strong><span>提高内部带宽和内存层之间的逻辑层数量来放大这种方法的好处</span></strong><span>。</span></p><p><span>无论PIM采用何种方法,系统架构师和程序员都必须解决一些关键的实际采用挑战,以使PIM在整个计算领域和工作负载的不同领域中得到广泛采用。除了描述这两种关键方法的工作,我们还在本教程中讨论这些挑战,以及解决这些挑战的现有工作。</span></p><p> </p><p> </p><hr /><h2 id='影响主存的主要趋势'><span>影响主存的主要趋势</span></h2><p><span>随着现代应用数据工作集大小的增长,对更高的DRAM容量和性能需求也在不断增加。然而,由于DRAM技术的扩展变得越来越具有挑战性,包括难以以低成本扩大DRAM芯片容量,同时保持性能、能效和可靠性。这导致了满足现代工作负载不断增长的内存需求变得越来越昂贵和困难。DRAM技术的扩展影响了DRAM的各项主要特征,包括容量、带宽、延迟、可靠性、能效和成本。因此,这些趋势促使了对智能内存控制器的需求,以更好地实现主存储器在各项指标上的扩展。这些</span><strong><span>智能内存控制器</span></strong><span>还可以更容易地为内存中的处理铺平道路,并作为PIM的起始基板。这些趋势使得设计低延迟主存储器芯片变得越来越重要,特别是在需要实时处理大量数据的情况下。</span></p><p><span>有几个key concerns:</span></p><ul><li><p><span>同时缩放DRAM容量(即密度或每位成本)、带宽和延迟是困难的</span></p></li><li><p><span>DRAM技术扩展到更小的节点会对DRAM的可靠性产生不利影响。</span></p><ul><li><p><span>随着DRAM单元的尺寸减小,电容和接入晶体管都变得更不可靠,更容易泄漏,通常更容易受到电噪声和干扰的影响。</span></p><ul><li><p><span>内存技术的缩放会导致内存错误更频繁地出现</span></p></li></ul></li></ul></li><li><p><span>激进的DRAM技术扩展导致的可靠性问题可能导致新的安全漏洞。</span></p><ul><li><p><span>比如RowHammer</span></p><ul><li><p><span>重复刷一个DRAM行,改变相邻行</span></p></li><li><p><span>使得可能一个应用程序的页对应的DRAM行持续被刷新导致操作系统的页对应的行发生比特翻转</span></p></li><li><p><span>RowHammer攻击可以借此获得一部分内核特权</span></p></li><li><p><span>(1)通过JavaScipt远程接管服务器</span></p></li><li><p><span>(2)一个虚拟机通过诱导错误来接管另一个虚拟机</span></p></li><li><p><span>(3)无权限的应用程序可以控制一个安卓设备</span></p></li><li><p><span>(4)攻击者可以通过windows10的浏览器获取任意读写权限</span></p></li></ul></li></ul></li><li><p><span>主存的能耗</span></p><ul><li><p><span>DRAM本质上是一种电力和能源消耗器,因为即使不使用它,它也会消耗能源</span></p></li><li><p><span>三个主要的原因导致主存能耗的情况更糟糕</span></p><ul><li><p><span>主存的容量、带宽、并行性和复杂性都在增加,由于更高的动态活动量和更高的整体静态功耗,导致能量消耗自然增加</span></p></li><li><p><span>主存仍然是主处理芯片,因此没有受益于许多节能机制有更好的集成</span></p></li><li><p><span>DRAM技术扩展的困难使得DRAM节能变得非常困难。事实上,添加到DRAM芯片中的一些机制,以补偿在较小技术的几代中的可靠性问题</span></p><ul><li><p><span>纠错机制</span></p></li><li><p><span>高刷新率</span></p></li></ul></li></ul></li></ul></li></ul><p><span>因此,相对于计算平台上的其他组件,主存的功耗和能耗正在增加。由于能源效率和可持续性是当今计算平台的关键必需品,因此减少主存的能源和功耗至关重要</span></p><p> </p><hr /><h2 id='利用智能内存控制器来提高内存扩展的需求'><span>利用智能内存控制器来提高内存扩展的需求</span></h2><blockquote><p><span>解决上述四个主要问题的一个关键方法是设计能够更好地管理主存的智能内存控制器</span></p></blockquote><p><span>一些关于智能内存控制器帮助克服现代DRAM主要的扩展挑战的例子</span></p><ul><li><p><span>以较低概率刷新DRAM相邻行来避免RowHammer等安全问题</span></p><ul><li><blockquote><p><span>这种方法被称为PARA (Probabilistic Adjacent Row Action,概率刷新行)</span></p><p><span>Flipping Bits in Memory Without Accessing Them: An Experimental Study of DRAM Disturbance Errors【ISCA'14】</span></p></blockquote></li></ul></li></ul><ul><li><p><span>通过对不同行的保留时间特征(retention time characteristics)的理解来缓解DRAM刷新问题</span></p><ul><li><p><span>由于制作工艺的不同,DRAM Cell的保留数据的时间是有差异的,大部分的DRAM Cell能保持比较久而小部分DRAM Cell只能保留一小部分时间。现代的内存控制器以最坏情况平等对待每一个DRAM Cell,从而造成了高能耗和性能损失。</span></p><ul><li><p><span>识别每一个行的最小保留时间</span></p></li><li><p><span>当这个行真的需要刷新了才去刷新这行</span></p></li><li><p><span>把很weak的行退役,不把数据放在里面存储</span></p></li></ul></li><li><p><span>也就是需要在线分析DRAM Cell的保留时间特征 并 在线调整每一行的刷新率</span></p><ul><li><p><span>(过往的工作)可以以很小的代价消除75%的刷新,从而显著降低能耗提升性能</span></p></li></ul></li></ul></li><li><p><span>基于不是所有的DRAM Cell都需要相同的访问时间的事实,智能内存控制器利用访问延迟中不同类型的异构性?</span></p><ul><li><p><span>温度:(例子)低温相对于高温时的读写延迟会低很多</span></p><ul><li><p><span>智能内存控制器可以使访问延迟适应工作温度来降低内存延迟</span></p></li></ul></li><li><p><span>多数DRAMCell可以比厂商定制的参数快得多</span></p><ul><li><p><span>可以识别具有可靠低延迟访问的DRAMCell,使用这些Cell降低系统的访问延迟</span></p></li></ul></li></ul><ul><li><p><span>电压:基于DRAM部分安全运行时的最小电压是不同的</span></p><ul><li><p><span>利用上述特征,将DRAM部分的工作电压从标准电压降低到最小电压之上,降低系统能耗</span></p></li><li><p><span>但需要增加bank延迟,以容忍降压产生的错误 ?</span></p></li></ul></li><li><p><span>bank subarrays 并行访问</span></p><ul><li><p><span>改芯片降低bank冲突延迟来实现bank里的subarrays可以被独立访问</span></p></li><li><p><span>利用对Bank的并行刷新和访问降低刷新对性能的影响</span></p></li><li><blockquote><p><span>为什么这就可以降低刷新对性能的影响呢?</span></p></blockquote></li></ul></li><li><p><span>通过对DRAM Array的划分降低对DRAM Bank的延迟</span></p><ul><li><p><span>于是行的一部分会比其他部分更快地访问</span></p></li><li><p><span>智能内存控制器可以决定哪些数据被放在更快(更慢)的行</span></p></li></ul></li><li><p><span>如果需要再次访问某一行,最近被访问或者最近被刷新的内存行能比标准延迟更快地访问</span></p><ul><li><p><span>因为对该行的访问和刷新操作已经为该行补充过电荷</span></p></li><li><p><span>智能内存控制器跟踪最近被访问/刷新的行的充电程度,并在使用该行时调整适应充电程度的延迟</span></p></li><li><p><span>显著降低访问和刷新延迟</span></p></li></ul></li><li><p><span>利用延迟-可靠性的权衡</span></p><ul><li><p><span>以低延迟和高吞吐量生成一个真正的随机数 ??? RANDOM</span></p></li><li><p><span>使用DRAM设备快速评估物理上不可复制的功能 ??? PUF</span></p></li><li><p><span>不同的DRAM Cell在延迟-可靠性权衡上表现出不同的特性</span></p><ul><li><p><span>一些cell fail得很随机 , 一些cell fail得很一致(当以违背时间参数的低延迟访问时)</span></p></li><li><p><span>智能内存控制器根据DRAM Cell在延迟-可靠性权衡上表现出的不同的特性决定谁作RANDOM、谁作PUF</span></p></li></ul></li></ul></li><li><p><span>跨混合内存的精细调度映射,充分发挥异构内存的优势避免异构内存的劣势</span></p><ul><li><p><span>(例子)异构可靠性内存:利用数据元素不同的错误漏洞特征决定数据的放置</span></p></li><li><p><span>(例子)神经网络:根据容错特征将不同的神经网络层映射到有不同访问延迟和电压的不同DRAM层来提升神经网络的推理效率、降低能耗</span></p></li></ul></li></ul></li></ul><p> </p><p> </p><hr /><h2 id='以处理器为中心的设计危险'><span>以处理器为中心的设计危险</span></h2><blockquote><p><span>现代计算机性能和能耗降级的主要原因是大量的数据迁移</span></p></blockquote><p><span>传统的以处理器为中心的计算机体系结构逻辑上二分了独立计算和独立存储两个部分。这两个部分通过长且耗能的互连介质相连,数据必须来回在处理器和存储器中迁移。</span></p><p><span>这种架构执行操作主要的流程如下:</span></p><ul><li><p><span>CPU向内存控制器发出请求,内存控制器通过片外线路分发一系列请求到DRAM模块</span></p></li><li><p><span>数据从DRAM模块中通过片外线路返回内存控制器</span></p></li><li><p><span>数据被放置在CPU的Cache和寄存器当中,被CPU核访问</span></p></li><li><p><span>最后CPU对数据执行操作</span></p></li></ul><p><span>上述的所有步骤为了将数据传入CPU芯片会消耗大量的时间带来大量能耗</span></p><p><span>以处理器为中心的系统,只有CPU(或者加速器)能够对数据执行计算操作。剩下的系统组件要么存储数据要么传输数据。处理器和存储器之间的数据移动</span><strong><span>至少有五种因素影响到了性能和能耗</span></strong><span>。</span></p><ul><li><p><strong><span>引脚数和成本限制了片外总线的宽度,导致进出主存的带宽较小、延迟较高</span></strong></p><ul><li><p><span>导致并行的主存请求提高并行性和容忍主存延迟的难度增大</span></p></li><li><p><span>为了优化上面的问题,就需要增大处理器存储器互连总线的宽度或者增加处理器存储器的通道数</span></p></li><li><p><span>而这又会带来更高的能耗和硬件开销</span></p></li></ul></li><li><p><strong><span>现代的计算机系统采用了很多传统的机制</span></strong><span>(比如传统的复杂的为多级缓存设置的机制【复杂的预取、大量的多线程、复杂耗能的乱序执行机制等等】),这些机制能够提高性能但同时也会</span><strong><span>引入摸具的消耗、能耗、额外的访问延迟和管理成本</span></strong><span>。一旦这些机制不那么有效的时候,就会</span><strong><span>造成能量浪费和额外的延迟开销进而影响本想提高的性能</span></strong><span>。</span></p><ul><li><p><span>换言之,处理器和存储器二分的体系结构招致了能量浪费和额外的系统复杂度,从而使得处理器中心的范式陷入恶性循环</span></p><ul><li><p><span>处理器和内存之间的数据移动已经造成了重大的能量浪费和延迟</span></p></li><li><p><span>为了容忍这种数据移动的延迟,现有的系统采用了许多复杂的机制,其有效性因工作负载而变化</span></p></li><li><p><span>这些复杂的机制反过来又会导致额外的能量浪费和延迟开销</span></p></li></ul></li><li><blockquote><p><span>这种恶性循环的根本原因是以处理器为中心的执行模型和设计范式,因此要打破这种恶性循环,需要通过改变范式(改为以数据为中心的范式)来解决这一基本原因</span></p></blockquote></li></ul></li></ul><ul><li><p><strong><span>现代计算机系统应用的很多缓存并不总是有效或者高效</span></strong><span>的</span></p><ul><li><p><span>被带到缓存中的很多数据不会被CPU重用</span></p><ul><li><p><span>导致了内存带宽和硬件空间的浪费</span></p></li><li><p><span>对内存的随机访问局部性较差,此时的Cache几乎失效</span></p></li><li><p><span>对于步长大于Cache大小的访问也会使得缓存失效</span></p></li><li><p><span>即使是连续使用缓存块中的所有元素流式访问内存,对于处理大型缓存也是低效率的,因为该块不会再被重用。</span></p></li></ul></li><li><p><span>在实际工作负载中,有很多上述的访问模式。这使得缓存非常低效或不必要,加剧了以处理器为中心的系统中的数据移动造成的能量浪费</span></p></li></ul></li><li><p><strong><span>现代的很多应用</span></strong><span>(图计算、稀疏数据结构上操作的负载【稀疏矩阵、稀疏神经网络】)会产生很多的</span><strong><span>随机访问</span></strong></p><ul><li><p><span>(例子)PageRank算法不仅在Cache上,而且在内存总线和主存访问上都很低效</span></p><ul><li><p><span>只有一小部分的从主存中读取的内存行和缓存行会被CPU使用</span></p></li><li><p><span>这使得预取变得十分困难,使得预取器非常低效</span></p></li></ul></li><li><blockquote><p><span>所以现代的以处理器为中心的内存体系结构不适合很多负载的随机内存访问模式</span></p></blockquote></li></ul></li><li><p><strong><span>处理器(包括加速器)长时间与主存保持耗能连接</span></strong></p><ul><li><p><span>这引入了显著的额外延迟以及显著的数据移动能耗,是现代系统关于延迟和能耗的关键限制</span></p></li></ul></li></ul><p> </p><p><span>要克服当前计算系统中导致低性能和大的能源低效率(以及高系统设计复杂性)的所有原因,首先需要认识到所有这些原因都是由现有计算系统所采用的以处理器为中心的设计范式造成的。因此,一个同时解决所有这些原因的基本解决方案需要一个范式转换。我们认为,未来的计算架构应该</span><strong><span>以数据为中心</span></strong><span>:它们应该</span></p><ul><li><p><span>(1)以最小的数据移动执行计算,</span></p></li><li><p><span>(2)计算有意义的地方(即数据所在的位置),而不是只在处理器(即CPU或加速器)中计算。</span></p></li></ul><p><span>因此,需要打破传统的计算单元和内存/通信单元之间的刚性二分,需要发明和启用一种能够实现数据驻留的计算的新范式。我们将这种通用的</span><strong><span>以数据为中心的执行模型和设计范例称为存内计算(PIM</span></strong><span>)。</span></p><blockquote><p><span>也可以称为存算一体</span></p></blockquote><p> </p><p> </p><h2 id='存内计算概述'><span>存内计算概述</span></h2><blockquote><p><span>大量的数据移动是现代计算机主要的以处理器为中心的设计范式的主要结果。</span></p></blockquote><p><strong><span>消除内存和处理器之间不必要的数据移动</span></strong><span>对于使未来的计算体系结构具有高性能、节能和可持续性至关重要。为此,存内计算(PIM)为内存子系统提供了执行计算的能力。</span></p><p><span>本节中首先会描述PIM的两种主要的技术</span></p><ul><li><p><span>3D堆叠的内存结构(HBM HMC..)</span></p></li><li><p><span>字节寻址内存的使用 (NVM)</span></p><ul><li><p><span>PCM (phase-change memory)</span></p></li><li><p><span>MRAM (magnetic RAM)</span></p></li><li><p><span>RRAM (metaloxide resistive RAM)</span></p></li></ul><blockquote><p><span>NVM也被证明可以执行更复杂的操作,比如乘法</span></p></blockquote></li></ul><p><span>然后会介绍两种很有前景的实现PIM的方法</span></p><ul><li><p><strong><span>processing using memory</span></strong><span> ----- </span><strong><span>PUM</span></strong><span> </span></p><blockquote><p><span> 偏向于电路革新,比如让存储器本身具有计算能力,但是这种方法目前计算精度较为有限。</span></p></blockquote><ul><li><p><span>利用现有的DRAM架构和DRAM电路的操作原理,在主存内实现(批量)处理操作。</span></p></li><li><p><span>这种极简的方法在主存中执行专门的计算时特别强大,通过利用主内存基板非常擅长的性能和对现有内存芯片的微小变化</span></p></li></ul></li></ul><ul><li><p><strong><span>processing near memory</span></strong><span> ---- </span><strong><span>PNM</span></strong></p><blockquote><p><span>存储器内部集成额外的计算单元,比如HBM HMC、logic in memory controllers.</span></p></blockquote><ul><li><p><span>利用了在3D堆叠内存的逻辑层中实现各种通用处理逻辑的能力,从而实现了在逻辑层和3D堆叠内存的内存层之间可用的高内部带宽和低延迟。</span></p></li></ul><ul><li><p><span>这是一种更通用的方法,其中在逻辑层中实现的逻辑可以是通用的,因此可以有利于广泛的应用程序</span></p></li></ul></li></ul><blockquote><p><span>关于3D堆叠的内存和NVM不在此处具体介绍,可以参见其它博客</span></p></blockquote><p><strong><span>请注意,使用PNM比使用PUM将更多的功能集成到内存芯片中,但这两种方法可以结合起来,从PIM中获得更高的好处</span></strong></p><p> </p><h2 id='processing-using-memory-pum'><span>Processing using memory (PUM)</span></h2><h3 id='rowclone'><span>RowClone</span></h3><p><span>有两类带宽密集型的内存操作</span></p><ul><li><p><span>批量数据复制</span></p></li><li><p><span>批量数据初始化</span></p></li></ul><blockquote><p><span>可以把这两种方法统称为批量数据移动操作,这种操作是耗时、能耗高、影响性能的</span></p></blockquote><p><strong><span>Onur Mutlu团队利用了批量数据移动操作不需要处理器部分的任何计算的事实提出了RowClone</span></strong></p><p><span>RowClone利用DRAM的内部组织和操作,在DRAM芯片内快速、高效地执行批量数据复制/初始化。DRAM芯片包含多个组,银行连接在一起,并通过共享的内部总线连接到外部I/O电路。每个bank被分为多个子数组。每个子数组包含许多行DRAMCell,其中每一列DRAM Cell使用位线通过多行连接在一起。</span></p><p> </p><p><span>RowClone由</span><strong><span>两种利用现有DRAM结构的机制组成</span></strong><span>:</span></p><ul><li><p><span>第一种机制是快速并行模式,它通过对源行和目标行发出反向激活(即,打开行)命令,将子数组中的一个行的数据复制到同一DRAM子数组中的另一行。下图说明了RowClone的快速并行模式的两个步骤。第一步激活源行A,它允许在行缓冲区中捕获整个行的数据。第二步激活目标行B,它允许将行缓冲区的内容复制到行B。因此,同一子阵列中的连续激活允许通过使用行缓冲区作为行A内容的临时缓冲区来将源行A复制到目标行B。</span></p><p><img src="rowclone.png" referrerpolicy="no-referrer"></p></li><li><p><span>第二种机制,流水线串行模式,可以使用DRAM芯片中的bank之间共享的共享内部总线,将任意数量的字节从一个bank中的一行传输到另一个bank中的另一行。</span></p></li></ul><p><span>RowClone显著降低了批量数据复制和初始化的原始延迟和能量消耗,导致4kB批量页面复制(使用快速并行模式)减少11.6×延迟和74.4×能量减少,成本非常低(仅0.01%的DRAM芯片面积开销)。这种减少直接转化为运行复制或初始化密集型工作负载的系统的性能和能源效率的提高</span></p><p><span>我们相信,RowClone为一个关键的和经常使用的操作提供了非常低成本的专门支持:数据复制和初始化。在延迟关键的系统中,如虚拟机,现代软件尽可能避免大量的数据复制,因为在现代系统中数据复制非常昂贵(因为它通过带宽瓶颈的内存总线通过处理器)。尽可能地消除副本会使软件设计复杂化,从而降低其可维护性和可读性。如果RowClone是在真正的芯片中实现的,也许由于页面副本的延迟减少,避免数据副本的需求将大大减少,从而导致更容易编写和维护的软件。因此,我们相信像RowClone这样简单的想法(以及建立在它之上的工作)可以对使系统和软件更快、更高效和整体上更好产生令人兴奋和前瞻性的影响</span></p><p> </p><h3 id='ambit'><span>Ambit</span></h3><p><span>除了上述提到的批量数据移动操作外,也有很多的应用有批量逐位操作,有一些典型的例子:</span></p><ul><li><p><span>数据库中的位图索引</span></p></li><li><p><span>数据库中的按位扫描加速(bitwise scan acceleration)</span></p></li><li><p><span>网络搜索的加速文档过滤</span></p></li><li><p><span>DNA序列对比</span></p></li><li><p><span>加密算法</span></p></li><li><p><span>图计算</span></p></li><li><p><span>网络</span></p></li></ul><p><span>加速这种批量逐位操作可以因此显著提升很多应用的性能和能效</span></p></div></div>
</body>
</html>