Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
formation:gpu4cbp [2023/03/10 16:33] equemene [Comparaison de toutes les implémentations : victoire incontestée de OpenCL] |
formation:gpu4cbp [2023/03/13 08:54] equemene [Implémenter une fonction coûteuse, la Transformée de Fourier] |
||
---|---|---|---|
Ligne 741: | Ligne 741: | ||
- la OpenACC reste supérieure aux implémentations OpenCL/CPU et OpenCL/GPU d'un facteur 3 | - la OpenACC reste supérieure aux implémentations OpenCL/CPU et OpenCL/GPU d'un facteur 3 | ||
- | Se contenter uniquement de ce test inviterait à fuire Python/OpenCL. Cependant, nous avons vu dans sur ''MySteps_2.py'' que la charge calculatoire doit être "vraiement" significative pour que le Python/OpenCL l'emporte de manière significative. Nous reviendrons donc dans la suite sur des versions modifiées de ces programmes C intégrant la fonction de Mylq ''MySillyFunction'', appelée plusieurs fois, pour juger si "vraiment" Python/OpenCL reste compétitif face à OpenMP et OpenACC. | + | Se contenter uniquement de ce test inviterait à fuire Python/OpenCL. Cependant, nous avons vu dans sur ''MySteps_2.py'' que la charge calculatoire doit être "vraiment" significative pour que le Python/OpenCL l'emporte de manière significative. Nous reviendrons donc dans la suite sur des versions modifiées de ces programmes C intégrant la fonction de Mylq ''MySillyFunction'', appelée plusieurs fois, pour juger si Python/OpenCL reste compétitif face à OpenMP et OpenACC. |
===== Un intermède CUDA et son implémentation PyCUDA ===== | ===== Un intermède CUDA et son implémentation PyCUDA ===== | ||
Ligne 1091: | Ligne 1091: | ||
Il sera alors possible d'estimer l'erreur numérique à ce calcul. | Il sera alors possible d'estimer l'erreur numérique à ce calcul. | ||
- | <note warning>**Exercice #4.1 : implémentation Python "naïve"** | + | <note warning>**Exercice #5.1 : implémentation Python "naïve"** |
- Modifiez ''MyDFT_1.py'' suivant les 7 spécifications ci-dessus | - Modifiez ''MyDFT_1.py'' suivant les 7 spécifications ci-dessus | ||
- Exécutez le programme pour une taille de **16** et contrôler la cohérence | - Exécutez le programme pour une taille de **16** et contrôler la cohérence | ||
Ligne 1124: | Ligne 1124: | ||
- comparer les résultats entre les deux avec ''linalg.norm'' | - comparer les résultats entre les deux avec ''linalg.norm'' | ||
- | <note warning>**Exercice #4.2 : implémentation Python Numpy** | + | <note warning>**Exercice #5.2 : implémentation Python Numpy** |
- Copiez le programme ''MyDFT_1.py'' en ''MyDFT_2.py'' | - Copiez le programme ''MyDFT_1.py'' en ''MyDFT_2.py'' | ||
- Modifiez ''MyDFT_2.py'' suivant les 7 spécifications ci-dessus | - Modifiez ''MyDFT_2.py'' suivant les 7 spécifications ci-dessus | ||
Ligne 1151: | Ligne 1151: | ||
- changer le domaine d'itération pour la boucle : ''range()'' par ''numba.prange()'' | - changer le domaine d'itération pour la boucle : ''range()'' par ''numba.prange()'' | ||
- | <note warning>**Exercice #4.3 : implémentation Python Numpy** | + | <note warning>**Exercice #5.3 : implémentation Python Numpy** |
- Copiez le programme ''MyDFT_2.py'' en ''MyDFT_3.py'' et exploitez ce dernier | - Copiez le programme ''MyDFT_2.py'' en ''MyDFT_3.py'' et exploitez ce dernier | ||
- Copiez la fonction ''NumpyDFT'' en ''NumbaDFT'' | - Copiez la fonction ''NumpyDFT'' en ''NumbaDFT'' | ||
Ligne 1181: | Ligne 1181: | ||
Pour l'implémentation OpenCL, la version "naïve" de l'implémentation va servir. Pour cela, il suffit de reprendre la définition de la méthode naïve et de l'implémenter en C dans un noyau OpenCL. A noter que Pi n'étant dans une variable définie, il faut explicitement la détailler dans le noyau OpenCL. Autre détail important : le //cast//. De manière a éviter tout effet de bord, il est fortement recommandé de //caster// les opérations dans la précision flottante souhaitée pour des opérations sur des indices entiers. | Pour l'implémentation OpenCL, la version "naïve" de l'implémentation va servir. Pour cela, il suffit de reprendre la définition de la méthode naïve et de l'implémenter en C dans un noyau OpenCL. A noter que Pi n'étant dans une variable définie, il faut explicitement la détailler dans le noyau OpenCL. Autre détail important : le //cast//. De manière a éviter tout effet de bord, il est fortement recommandé de //caster// les opérations dans la précision flottante souhaitée pour des opérations sur des indices entiers. | ||
- | <note warning>**Exercice #4.4 : implémentation Python OpenCL** | + | <note warning>**Exercice #5.4 : implémentation Python OpenCL** |
- Copiez le programme ''MyDFT_3.py'' en ''MyDFT_4.py'' et exploitez ce dernier | - Copiez le programme ''MyDFT_3.py'' en ''MyDFT_4.py'' et exploitez ce dernier | ||
- Copiez la fonction python ''OpenCLAddition'' en ''OpenCLDFT'' | - Copiez la fonction python ''OpenCLAddition'' en ''OpenCLDFT'' | ||
Ligne 1256: | Ligne 1256: | ||
* modifier les vecteurs en sortie (2 vecteurs) | * modifier les vecteurs en sortie (2 vecteurs) | ||
- | <note warning>**Exercice #4.5 : implémentation Python CUDA** | + | <note warning>**Exercice #5.5 : implémentation Python CUDA** |
- Copiez le programme ''MyDFT_4.py'' en ''MyDFT_5.py'' et exploitez ce dernier | - Copiez le programme ''MyDFT_4.py'' en ''MyDFT_5.py'' et exploitez ce dernier | ||
- Copiez la fonction python ''CUDAAddition'' en ''CUDADFT'' | - Copiez la fonction python ''CUDAAddition'' en ''CUDADFT'' |