Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
Parallel STL course
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Michaël El Kharroubi
Parallel STL course
Commits
309b7186
Verified
Commit
309b7186
authored
1 year ago
by
Michaël El Kharroubi
Browse files
Options
Downloads
Patches
Plain Diff
[WIP] Working on Nvidia STL class
parent
47466b2a
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
Nvidia_STL.typ
+53
-0
53 additions, 0 deletions
Nvidia_STL.typ
cpp_basics_for_STL.typ
+11
-10
11 additions, 10 deletions
cpp_basics_for_STL.typ
with
64 additions
and
10 deletions
Nvidia_STL.typ
+
53
−
0
View file @
309b7186
...
@@ -146,6 +146,59 @@ Le paramètre `stdpar` prend 2 valeurs :
...
@@ -146,6 +146,59 @@ Le paramètre `stdpar` prend 2 valeurs :
#new-section-slide("Comment passer des données au GPU avec les captures")
#new-section-slide("Comment passer des données au GPU avec les captures")
#slide(
title: "Communiquer des données au GPU",
)[
Pour rappel, le GPU et CPU ont deux espaces d
'
adressage
distincs
.
On
ne
peut
donc
pas
directement
acc
é
der
à
des
donn
é
es
qui
se
trouve
sur
la
ram
de
l
'
_Host_
depuis le _Device_.
Quand on passe simplement un itérateur à un algorithme STL, il n
'
y
a
rien
besoin
de
faire
.
Le
compilateur
va
g
é
rer
l
'
allocation, la copie et la libération des
données sur le device.
Mais comment faire pour capturer un vecteur par exemple?
]
#slide(title: "Exemple d
'
acc
è
s
ill
é
gal
"
)[
```cpp
std::vector<int> v = {6, 3, 4, 12, 1, 15};
std::vector<int> idxs(v.size(), 0);
std::iota(idxs.begin(), idxs.end(), 0);
int cst = 4;
std::for_each(std::execution::par_unseq,
idxs.begin(), idxs.end(),
[&v, &cst](int i){
v[i] += cst;
});
```
Ce code provoque un warning à la compilation et une erreur
`cudaErrorIllegalAddress` à l'exécution.
]
#slide(title:
"
Solution
"
)[
Pour régler ce problème, il suffit de capturer la mémoire par copie.
```cpp
std::vector<int> v = {6, 3, 4, 12, 1, 15};
std::vector<int> idxs(v.size(), 0);
std::iota(idxs.begin(), idxs.end(), 0);
int cst = 4;
std::for_each(std::execution::par_unseq,
idxs.begin(), idxs.end(),
[device_v = v.data(), cst](int i) {
device_v[i] += cst;
});
```
]
#new-section-slide(
"
Le
futur
avec
C
+
+23
(
views
et
mdspans
)
"
)
#new-section-slide(
"
Le
futur
avec
C
+
+23
(
views
et
mdspans
)
"
)
#new-section-slide(
"
Notions
à
retenir
"
)
#new-section-slide(
"
Notions
à
retenir
"
)
...
...
This diff is collapsed.
Click to expand it.
cpp_basics_for_STL.typ
+
11
−
10
View file @
309b7186
...
@@ -261,19 +261,19 @@ Il existe deux moyens de capturer une variable :
...
@@ -261,19 +261,19 @@ Il existe deux moyens de capturer une variable :
== Par copie
== Par copie
```cpp
```cpp
int var = 5;
int var = 5;
auto add_
cst
= [v=var](int i)
auto add_
var
= [v=var](int i)
{ return i+v; };
{ return i+v; };
var = 2;
var = 2;
int x = add_
cst
(10); // x vaut 15
int x = add_
var
(10); // x vaut 15
```
```
#colbreak()
#colbreak()
== Par référence
== Par référence
```cpp
```cpp
int var = 5;
int var = 5;
auto add_
cst
= [v=&var](int i)
auto add_
var
= [v=&var](int i)
{ return i+*v;};
{ return i+*v;};
var = 2;
var = 2;
int x = add_
cst
(10); // x vaut 12
int x = add_
var
(10); // x vaut 12
```
```
])
])
]
]
...
@@ -285,19 +285,19 @@ On peut également copier l'environnement au complet :
...
@@ -285,19 +285,19 @@ On peut également copier l'environnement au complet :
== Par copie
== Par copie
```cpp
```cpp
int var = 5;
int var = 5;
auto add_
cst
= [=](int i)
auto add_
var
= [=](int i)
{ return i+var; };
{ return i+var; };
var = 2;
var = 2;
int x = add_
cst
(10); // x vaut 15
int x = add_
var
(10); // x vaut 15
```
```
#colbreak()
#colbreak()
== Par référence
== Par référence
```cpp
```cpp
int var = 5;
int var = 5;
auto add_
cst
= [&](int i)
auto add_
var
= [&](int i)
{ return i+var;};
{ return i+var;};
var = 2;
var = 2;
int x = add_
cst
(10); // x vaut 12
int x = add_
var
(10); // x vaut 12
```
```
])
])
]
]
...
@@ -400,8 +400,8 @@ std::cout << std::endl;
...
@@ -400,8 +400,8 @@ std::cout << std::endl;
)[
)[
- Les collections proposent un itérateur sur le début et la fin avec les méthodes
- Les collections proposent un itérateur sur le début et la fin avec les méthodes
`begin` et `end`
`begin` et `end`
- Un `std::vector` est un tableau d
e taille dynamique
- Un `std::vector` est un tableau d
ynamique et un `std::array` est un tableau
- Un `std::array` est un tableau
statique
statique
- Si l'on est pas responsable des données, il faut utiliser un `std::span`
- Si l'on est pas responsable des données, il faut utiliser un `std::span`
- Les lambdas sont des fonctions anonymes qui peuvent capturer totalement ou
- Les lambdas sont des fonctions anonymes qui peuvent capturer totalement ou
partiellement leur environnement
partiellement leur environnement
...
@@ -411,6 +411,7 @@ std::cout << std::endl;
...
@@ -411,6 +411,7 @@ std::cout << std::endl;
#box(inset: 5%, columns(2, gutter: 22pt)[
#box(inset: 5%, columns(2, gutter: 22pt)[
- `iota`
- `iota`
- `transform`
- `transform`
- `for_each`
#colbreak()
#colbreak()
- `accumulate`
- `accumulate`
- `remove_if`
- `remove_if`
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment