Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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:32]
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 1010: Ligne 1010:
 La difficulté viendra du temps d'​exécution de la version séquentielle qui atteint son pallier de performances pour une taille croissante de vecteurs assez rapidement et du choix judicieux de l'​inhibition de l'​exécution séquentielle pour permettre d'​atteindre des tailles de vecteurs significatives. La difficulté viendra du temps d'​exécution de la version séquentielle qui atteint son pallier de performances pour une taille croissante de vecteurs assez rapidement et du choix judicieux de l'​inhibition de l'​exécution séquentielle pour permettre d'​atteindre des tailles de vecteurs significatives.
  
-<note warning>​**Exercice #2.4 : exécution des différentes implémentations**+<note warning>​**Exercice #4.1 : exécution des différentes implémentations**
   - Compilez ''​MySteps_6.c''​ en ''​MySteps_6''​   - Compilez ''​MySteps_6.c''​ en ''​MySteps_6''​
   - Compilez ''​MySteps_6_openmp.c''​ en ''​MySteps_6_openmp'' ​   - Compilez ''​MySteps_6_openmp.c''​ en ''​MySteps_6_openmp'' ​
Ligne 1046: Ligne 1046:
 Si la performance pour une taille de 2097152 est moins de 5% supérieure à la performance pour une taille de 1048576, vous pouvez considérer que vous avez atteint le quasi-optimum de performance. L'​objectif est d'​atteindre cette limite. Si la performance pour une taille de 2097152 est moins de 5% supérieure à la performance pour une taille de 1048576, vous pouvez considérer que vous avez atteint le quasi-optimum de performance. L'​objectif est d'​atteindre cette limite.
  
-<note warning>​**Exercice #2.: exploration de la meilleure performance OpenCL et CUDA**+<note warning>​**Exercice #4.: exploration de la meilleure performance OpenCL et CUDA**
   - Exécutez ''​MySteps_6.py''​ en OpenCL Intel sur des tailles croissantes avec l'​option ''​-n''​   - Exécutez ''​MySteps_6.py''​ en OpenCL Intel sur des tailles croissantes avec l'​option ''​-n''​
   - Relevez **OpenCLRate** pour les différentes charges   - Relevez **OpenCLRate** pour les différentes charges
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''​
formation/gpu4cbp.txt · Dernière modification: 2024/02/22 11:47 par equemene