diff --git a/presentation/codes/ex_rayon/Cargo.toml b/presentation/codes/ex_rayon/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..138cf63e39fc06c2fefe15dc2a1d71f3e9be6daf --- /dev/null +++ b/presentation/codes/ex_rayon/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "ex_rayon" +version = "0.1.0" +authors = ["Orestis Malaspinas <orestis.malaspinas@hesge.ch>"] +edition = "2018" + +[dependencies] +rayon = "1.0" \ No newline at end of file diff --git a/presentation/codes/ex_rayon/src/main.rs b/presentation/codes/ex_rayon/src/main.rs new file mode 100644 index 0000000000000000000000000000000000000000..58ebf598157d28910002c80f54dad72f6056ad50 --- /dev/null +++ b/presentation/codes/ex_rayon/src/main.rs @@ -0,0 +1,26 @@ +extern crate rayon; + +use rayon::iter::IntoParallelRefIterator; +use rayon::iter::ParallelIterator; + +fn sum_counter(v: &Vec<i32>) -> (i32, i32) { + let mut counter = 0; + // let res = v.iter().map(|&vi| { + let res = v.par_iter().map(|&vi| { + counter += 1; + vi * vi + }).sum(); + (res, counter) + +} + +fn main() { + let v = vec![1, 2, 3, 4, 5, 6, 7, 8]; + + let res: i32 = v.iter().map(|&vi| vi * vi).sum(); + let res: i32 = v.par_iter().map(|&vi| vi * vi).sum(); + + println!("res = {}", res); + + println!("res, counter = {:?}", sum_counter(&v)); +} diff --git a/presentation/intro.md b/presentation/intro.md index 1bd18da8fde20b6e6f133eec485221bf5c7d6c77..8ed3bb2609d89ea817f0f285064bc04d01da8f1e 100644 --- a/presentation/intro.md +++ b/presentation/intro.md @@ -381,6 +381,63 @@ Garantissent (presque toujours): - En bon Rust ils doivent être rares (4% du code de `rustc`). - Exemple : `raw pointer` +## `raw pointers` (1/2) + +- Créer un `raw pointer` est sûr + +<pre><code data-trim="hljs rust" class="lang-rust"> +fn main() { + let x = 5; + let raw = &x as *const i32; + + let mut y = 10; + let raw_mut = &mut y as *mut i32; +} +</code></pre> + +## `raw pointers` + +- Le déréférencer est dangereux + +<pre><code data-trim="hljs rust" class="lang-rust"> +fn main() { + let x = 5; + let raw = &x as *const i32; + + println!("raw points at {}", *raw); +} +</code></pre> + +# Généricité + +## Traits + +- Interface, classe abstraite, classe virtuelle, ... +- Implémentés pour un type. + +<pre><code data-trim="hljs rust" class="lang-rust"> +trait Clone { // déclaration de l'interface + // &self -> référence du receveur + // Self -> type qui implémente le trait + + fn clone(&self) -> Self; +} + +// T est générique +// on doit donner des contraintes +// on sait que le type implémente Clone +impl<T: Clone> Clone for Vec<T> { + fn clone(&self) -> Self { + let mut v = Vec::new(); + for elem in self { + // elem devient une référence vers chaque élément de self + v.push(elem.clone()); + } + return v; + } +} +</code></pre> + # Fearless concurrency ## Data race @@ -557,9 +614,63 @@ Ce qui se passe en mémoire - Les primitives que nous venons de voir sont les seules disponibles dans la `std`. - Pour "plus": `rayon` ou `crossbeam` par exemple. +## `rayon` (1/2) + +Librairie haut niveau pour faire du parallélisme: + +- Permet de paralléliser automatiquement les itérateurs: `iter`->`par_iter`. + +<pre><code data-trim="hljs rust" class="lang-rust"> +extern crate rayon; + +use rayon::iter::IntoParallelRefIterator; +use rayon::iter::ParallelIterator; + +fn main() { + let v = vec![1, 2, 3, 4, 5, 6, 7, 8]; + + let res: i32 = v.iter().map(|&vi| vi * vi).sum(); + // let res: i32 = v.par_iter().map(|&vi| vi * vi).sum(); + + println!("res = {}", res); +} + +</code></pre> + +## `rayon` (2/2) + +Librairie haut niveau pour faire du parallélisme: + +- Conserve **toutes** les garanties de sécurité! + +<pre><code data-trim="hljs rust" class="lang-rust"> +extern crate rayon; + +use rayon::iter::IntoParallelRefIterator; +use rayon::iter::ParallelIterator; + +fn main() { + let v = vec![1, 2, 3, 4, 5, 6, 7, 8]; + + let mut counter = 0; + let res: i32 = v.iter().map(|&vi| { + counter += 1; + vi * vi + }).sum(); + + // let res: i32 = v.par_iter().map(|&vi| { + // counter += 1; + // vi * vi + // }).sum(); + + println!("res = {}", res); +} +</code></pre> + # Et beaucoup plus - Gestion d'erreurs: `Option`, `Result`. +- Généricité. - Tests ("documentation testing"). - Benchmarks (`nightly only`). - *Hygienic* `macros!`.