-
Notifications
You must be signed in to change notification settings - Fork 104
/
Copy pathindex.html
234 lines (229 loc) · 8.38 KB
/
index.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
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../common-revealjs/css/reveal.css">
<link rel="stylesheet" href="../common-revealjs/css/theme/white.css">
<link rel="stylesheet" href="../common-revealjs/css/custom.css">
<script>
// This is needed when printing the slides to pdf
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? '../common-revealjs/css/print/pdf.css' : '../common-revealjs/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<script>
// This is used to display the static images on each slide,
// See global-images in this html file and custom.css
(function() {
if(window.addEventListener) {
window.addEventListener('load', () => {
let slides = document.getElementsByClassName("slide-background");
if (slides.length === 0) {
slides = document.getElementsByClassName("pdf-page")
}
// Insert global images on each slide
for(let i = 0, max = slides.length; i < max; i++) {
let cln = document.getElementById("global-images").cloneNode(true);
cln.removeAttribute("id");
slides[i].appendChild(cln);
}
// Remove top level global images
let elem = document.getElementById("global-images");
elem.parentElement.removeChild(elem);
}, false);
}
})();
</script>
</head>
<body>
<div class="reveal">
<div class="slides">
<div id="global-images" class="global-images">
<img src="../common-revealjs/images/sycl_academy.png" />
<img src="../common-revealjs/images/sycl_logo.png" />
<img src="../common-revealjs/images/trademarks.png" />
</div>
<!--Slide 1-->
<section class="hbox">
<div class="hbox" data-markdown>
## Introduction to USM
</div>
</section>
<!--Slide 2-->
<section class="hbox" data-markdown>
## Learning Objectives
* Learn about the USM data management model
* Learn about the benefits of USM and when to use it
* Learn about the variations of USM
* Learn about the kinds of USM memory allocations
</section>
<!--Slide 3-->
<section>
<div class="hbox" data-markdown>
#### What is USM?
</div>
<div class="container" data-markdown>
Unified shared memory (USM) provides an alternative pointer-based data management model to the accessor-buffer model
</div>
<div class="container" data-markdown>
* Unified virtual address space
* Pointer-based structures
* Explicit memory management
* Shared memory allocations
</div>
</section>
<!--Slide 4-->
<section>
<div class="hbox" data-markdown>
#### Unified virtual address space
</div>
<div class="container">
<div class="col" data-markdown>

</div>
<div class="col" data-markdown>
* USM memory allocations return pointers which are consistent between the host application and kernel functions on a device
* Representing data between the host and device(s) does not require creating accessors
* Pointer-based API more familiar to C or C++ programmers
</div>
</div>
</section>
<!--Slide 5-->
<section>
<div class="hbox" data-markdown>
#### Pointer based structures
</div>
<div class="container">
<div class="col" data-markdown>

</div>
<div class="col" data-markdown>
* Data is moved between the host and device(s) in a span of memory in bytes rather than a buffer of a specific type
* Pointers within that region of memory can freely point to any other address in that region
* Easier to port existing C or C++ code to use SYCL
</div>
</div>
</section>
<!--Slide 6-->
<section>
<div class="hbox" data-markdown>
#### Explicit memory management
</div>
<div class="container">
<div class="col" data-markdown>

</div>
<div class="col" data-markdown>
* Memory is allocated and data is moved using explicit routines
* Moving data between the host and device(s) does not require accessors or submitting command groups
* The SYCL runtime will not perform any data dependency analysis, dependencies between commands must be managed manually
</div>
</div>
</section>
<!--Slide 7-->
<section>
<div class="hbox" data-markdown>
#### Shared memory allocations
</div>
<div class="container">
<div class="col" data-markdown>

</div>
<div class="col" data-markdown>
* Some platforms will support variants of USM where memory allocations share the same memory region between the host and device(s)
* No explicit routines are required to move the data between the host and device(s)
</div>
</div>
</section>
<!--Slide 8-->
<section>
<div class="hbox" data-markdown>
#### USM allocation types
</div>
<div class="container" data-markdown>
USM has three different kinds of memory allocation
</div>
<div class="container" data-markdown>
* A **host** allocation is allocated in host memory
* A **device** allocation is allocation in device memory
* A **shared** allocation is allocated in shared memory and can migrate back and forth
</div>
</section>
<!--Slide 9-->
<section>
<div class="hbox" data-markdown>
#### USM variants
</div>
<div class="container" data-markdown>
USM has four variants which a platform can support with varying levels of support
</div>
<div class="container" data-markdown>

</div>
</section>
<!--Slide 10-->
<section>
<div class="hbox" data-markdown>
#### Querying for support
</div>
<div class="container" data-markdown>
Each SYCL platform and its device(s) will support
different variants of USM and different kinds of memory allocation
</div>
<code><pre>if (dev.has(sycl::aspect::usm_device_allocations))</code></pre>
</section>
<!--Slide 11-->
<section>
<div class="hbox" data-markdown>
#### Buffer/accessor vs USM
</div>
<div class="container" data-markdown>
So when should you use the accessor/buffer mode and
when should you use the USM model?
</div>
<div class="container" data-markdown>
* The **buffer/accessor** provides guaranteed
consistency and automatically manages dependencies
* Recommended when you need to iterate over or
prototype your application
* Recommended for maximum performance portability
* Provides a lot of information to the SYCL runtime which can perform many optimizations automatically
* The **USM** model provides a lower-level pointer-based
solution with fine grained control
* Recommended when porting existing C++ applications
or using pointer-based structures
* User has responsibility for certain aspects relevant for performance (e.g. data transfers or data prefetches)
</div>
</section>
<!--Slide 12-->
<section>
<div class="hbox" data-markdown>
## Questions
</div>
</section>
<!--Slide 13-->
<section>
<div class="hbox" data-markdown>
#### Exercise
</div>
<div class="container" data-markdown>
Code_Exercises/Introduction_to_USM/source
</div>
<div class="container" data-markdown>
Implement a device selector that chooses a device in your system which supports explicit USM and device allocations
</div>
</section>
</div>
</div>
<script src="../common-revealjs/js/reveal.js"></script>
<script src="../common-revealjs/plugin/markdown/marked.js"></script>
<script src="../common-revealjs/plugin/markdown/markdown.js"></script>
<script src="../common-revealjs/plugin/notes/notes.js"></script>
<script>
Reveal.initialize({mouseWheel: true, defaultNotes: true});
Reveal.configure({ slideNumber: true });
</script>
</body>
</html>