-
Notifications
You must be signed in to change notification settings - Fork 102
/
index.html
300 lines (295 loc) · 9.75 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
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
<!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" />
<img src="../common-revealjs/images/codeplay.png" />
</div>
<!--Slide 1-->
<section class="hbox">
<div class="hbox" data-markdown>
## Multiple Devices
</div>
</section>
<!--Slide 2-->
<section class="hbox" data-markdown>
## Learning Objectives
* Learn about contexts and what they are used for
* Learn about how create dependencies across devices
* Learn about moving data between devices
</section>
<!--Slide 3-->
<section>
<div class="hbox" data-markdown>
#### What is a context
</div>
<div class="container">
<div class="col-right-1" data-markdown>
* In SYCL the underlying execution and memory resources of a platform and its devices is managed by creating a context
* A context represents one or more devices, but all devices must be associated with the same platform
</div>
</div>
</section>
<!--Slide 4-->
<section>
<div class="hbox" data-markdown>
#### Implicit context
</div>
<div class="container">
<div class="col-left-1" data-markdown>
![Queue](../common-revealjs/images/queue-5.png "SYCL-Queue")
</div>
<div class="col-right-1" data-markdown>
* Every `queue` requires a `context` to manage
memory allocation and data movement.
* If one is not specified explicitly a `queue` will
create a `context` implicitly.
</div>
</div>
</section>
<!--Slide 5-->
<section>
<div class="hbox" data-markdown>
#### Shared context
</div>
<div class="container">
<div class="col-left-1" data-markdown>
![Queue](../common-revealjs/images/queue-1.png "SYCL-Queue")
</div>
<div class="col-right-1" data-markdown>
* In order to ensure data is efficiently moved
between devices in the same platform you can create
a common `context`.
</div>
</div>
</section>
<!--Slide 6-->
<section>
<div class="hbox" data-markdown>
#### Creating queues
</div>
<div class="container">
<div class="col-left-1" data-markdown>
![Queue](../common-revealjs/images/queue-3.png "SYCL-Queue")
</div>
<div class="col-right-1" data-markdown>
* You can then create a `queue` for each of the
devices from the common `context`.
</div>
</div>
</section>
<!--Slide 7-->
<section>
<div class="hbox" data-markdown>
#### Creating an implicit context
</div>
<div class="container">
<code><pre>
auto defaultQueue = queue{};
</code></pre>
</div>
<div class="smaller-size-font" data-markdown>
* A default constructed queue object will use the
`default_selector` to choose a device and create an
implicit `context`.
</div>
</section>
<!--Slide 8-->
<section>
<div class="hbox" data-markdown>
#### Creating a context from devices
</div>
<div class="container">
<code><pre>
auto sharedContext = context{{cpuDevice, gpuDevice}};
</code></pre>
</div>
<div class="smaller-size-font" data-markdown>
* You can construct a `context` from a `std::vector` of
`device`s.
</div>
</section>
<!--Slide 9-->
<section>
<div class="hbox" data-markdown>
#### Creating a context from a platform
</div>
<div class="container">
<code><pre>
auto sharedContext = context{intelPlatform};
</code></pre>
</div>
<div class="smaller-size-font" data-markdown>
* You can construct a `context` from a `platform` in
which case it will be associated with all of the devices
of that `platform`.
</div>
</section>
<!--Slide 10-->
<section>
<div class="hbox" data-markdown>
#### Targeting multiple devices
</div>
<div class="container">
<div class="col-right-1" data-markdown>
* A single SYCL application will often want to
target multiple different devices.
* This can be useful for task level parallelism and
load balancing.
* When doing so you want to ensure that data is
moved between devices in a `context` efficiently.
</div>
</div>
</section>
<!--Slide 11-->
<section>
<div class="hbox" data-markdown>
#### Moving between devices
</div>
<div class="container" data-markdown>
* Often in heterogeneous applications it's necessary to
move data from one device to another.
* In the USM model this is done explicit via `memcpy` as
we've seen before.
* In the buffer/accessor model this is done
automatically based on dependency analysis.
</div>
</section>
<!--Slide 12-->
<section>
<div class="hbox" data-markdown>
#### Accessing data on a device
</div>
<div class="container">
<div class="col" data-markdown>
* Remember that a `buffer` will move data to a
device when required by an `accessor`.
</div>
<div class="col" data-markdown>
![Buffer Copied](../common-revealjs/images/buffer-hostmemory-accessor-cg-device.png "Buffer Copied")
</div>
</div>
</section>
<!--Slide 13-->
<section>
<div class="hbox" data-markdown>
#### Accessing data on another device (same context)
</div>
<div class="container">
<div class="col" data-markdown>
* Now if a `buffer` is accessed on a device when the
latest copy of the data is on another device, the
data will be moved between the devices.
* If the two devices are of the same context the
data can be copied directly.
</div>
<div class="col" data-markdown>
![Buffer Copied](../common-revealjs/images/buffer-copied.png "Buffer Copied")
</div>
</div>
</section>
<!--Slide 14-->
<section>
<div class="hbox" data-markdown>
#### Accessing data on another device (different context)
</div>
<div class="container">
<div class="col" data-markdown>
* If the devices are of different `context`s the
data must be copied via host memory.
* It's important to consider this as it could incur
further overhead when moving data between devices.
</div>
<div class="col" data-markdown>
![Buffer Copied](../common-revealjs/images/copy-via-host.png "Buffer Copied")
</div>
</div>
</section>
<!--Slide 15-->
<section>
<div class="hbox" data-markdown>
#### Moving between devices (buffer/accessor)
</div>
<div class="container">
<div class="col" data-markdown>
![SYCL](../common-revealjs/images/moving_data_between_devices.png "SYCL")
</div>
<div class="col" data-markdown>
* If a `buffer` is accessed by kernel functions in two different devices commands are enqueued to automatically move the data to the devices it is being accessed on.
* If both of those devices are associated with the same context (i.e. same vendor) then the copy is direct.
* Otherwise the copy will generally go via the host and has additional overhead.
</div>
</div>
</section>
<!--Slide 16-->
<section>
<div class="hbox" data-markdown>
## Questions
</div>
</section>
<!--Slide 17-->
<section>
<div class="hbox" data-markdown>
#### Exercise
</div>
<div class="container" data-markdown>
Code_Exercises/Multiple_Devices/source
</div>
<div class="container" data-markdown>
Write a SYCL application that splits up a task between
two devices.
</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>