Skip to content
Snippets Groups Projects
Verified Commit 309b7186 authored by Michaël El Kharroubi's avatar Michaël El Kharroubi :satellite:
Browse files

[WIP] Working on Nvidia STL class

parent 47466b2a
No related branches found
No related tags found
No related merge requests found
...@@ -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")
......
...@@ -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 de taille dynamique - Un `std::vector` est un tableau dynamique 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`
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment