You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Remarquez que nous avons tiré tous les points aléatoires *avant* la boucle et les avons passés
@@ -760,16 +775,16 @@ Dans {ref}`numba_ex3`, nous avons tiré tous les points aléatoires *avant* la b
760
775
761
776
Il est tentant de plutôt tirer chaque point *à l'intérieur* de la boucle `prange`, en passant un générateur `rng` en argument et en appelant `rng.uniform()` dans le corps de la boucle.
762
777
763
-
Essayez-le: le code devrait s'exécuter et renvoyer un nombre proche de $\pi$, pourtant il y a un bug subtil dans cette approche.
778
+
Essayez-le: le code devrait s'exécuter et renvoyer un nombre proche de $\pi$, pourtant il y a un bug subtil dans cette approche.
764
779
765
-
Enquêtez comme suit:
780
+
Enquêtez comme suit:
766
781
767
782
1. Appelez votre fonction quelques fois avec la *même* graine et vérifiez si le résultat est reproductible.
768
783
2. Répétez l'estimation de nombreuses fois sur une gamme de tailles d'échantillon et comparez sa dispersion à celle d'une version parallèle correcte.
769
784
770
785
Expliquez ensuite ce qui ne va pas et donnez une manière correcte de tirer à l'intérieur d'une boucle parallèle.
771
786
772
-
Astuce: essayez d'utiliser une fonction aléatoire ancienne telle que `np.random.uniform()` au lieu d'un `Generator` et voyez ce qui se passe.
787
+
Astuce: essayez d'utiliser une fonction aléatoire ancienne telle que `np.random.uniform()` au lieu d'un `Generator` et voyez ce qui se passe.
Le code s'exécute sans erreur et renvoie quelque chose de proche de $\pi$.
@@ -814,20 +829,20 @@ imprévisible.
814
829
815
830
Deux symptômes révèlent le problème.
816
831
817
-
*Symptôme 1: le résultat n'est plus reproductible.*
832
+
*Symptôme 1: le résultat n'est plus reproductible.*
818
833
819
834
Un générateur correct renvoie la même réponse chaque fois qu'on lui donne la même graine.
820
835
821
836
À cause de la course aux données, l'ordre dans lequel les threads touchent l'état partagé affecte le flux de tirages, de sorte que la réponse n'est pas reproductible même lorsque la graine est fixée.
Chaque appel utilise la même graine, pourtant les réponses diffèrent.
829
844
830
-
*Symptôme 2: l'estimateur est bien plus bruité qu'il ne devrait l'être.*
845
+
*Symptôme 2: l'estimateur est bien plus bruité qu'il ne devrait l'être.*
831
846
832
847
Les tirages dupliqués et corrélés portent moins d'information que $n$ tirages indépendants, de sorte que la taille d'échantillon *effective* est bien plus petite que $n$.
833
848
@@ -854,7 +869,7 @@ num_reps = 20
854
869
methods = [("état par thread (correct)",
855
870
lambda n: calculate_pi_legacy(n), 'C0'),
856
871
("générateur partagé dans prange (course aux données)",
Les deux bandes sont centrées sur $\pi$, mais la bande associée à la course aux données est bien plus large que l'autre et se rétrécit très lentement à mesure que la taille de l'échantillon augmente.
876
891
877
-
L'autre option sûre est celle de {ref}`numba_ex3`: tirer les points avant la boucle afin que la boucle parallèle ne fasse que lire depuis la mémoire.
892
+
L'autre option sûre est celle de {ref}`numba_ex3`: tirer les points avant la boucle afin que la boucle parallèle ne fasse que lire depuis la mémoire.
878
893
879
894
```{solution-end}
880
895
```
@@ -905,7 +920,7 @@ rng = np.random.default_rng()
905
920
with qe.Timer():
906
921
u_draws = rng.uniform(size=n)
907
922
v_draws = rng.uniform(size=n)
908
-
calculate_pi(u_draws, v_draws)
923
+
calculate_pi_parallel(u_draws, v_draws)
909
924
```
910
925
911
926
```{code-cell} ipython3
@@ -1000,8 +1015,17 @@ $$
1000
1015
1001
1016
En utilisant ce fait, la solution peut s'écrire comme suit.
1002
1017
1003
-
Notez que les tirages aléatoires sont conservés à l'intérieur de la boucle interne plutôt que pré-alloués,
1004
-
afin d'éviter de créer de grands tableaux de chocs de taille `M * n`.
1018
+
```{note}
1019
+
Ici, nous conservons les tirages aléatoires à l'intérieur de la boucle interne et utilisons l'ancienne
1020
+
API `np.random.randn()` plutôt qu'un `Generator`.
1021
+
1022
+
En effet, le support de Numba pour les objets `Generator` n'est pas
0 commit comments