Le but du script Spirals est de créer une image générée par ordinateur. L'image mappe aux GPU avec le support CUDA.
Voici des exemples d'images créées avec le script Python. Leurs détails de configuration se trouvent dans le dossier Exemples avec d'autres exemples.
Afin d'exécuter le script Python, les dépendances suivantes doivent être installées:
Lorsqu'il est exécuté séquentiellement sur un Intel i7-9700K, chaque image prend environ 23,5877081 secondes.
La première étape pour optimiser l'algorithme CGI a été de reconstruire l'algorithme pour une utilisation parallèle sur le GPU. Cela a été fait en utilisant le décorateur @cuda.jit , qui nécessite une invocation du noyau. Avant que l'algorithme ne s'exécute, le code détermine comment mapper un tableau de pixels sur le matériel GPU. Dans l'algorithme, des boucles pour calculer chaque pixel sont remplacées par i, j = cuda.grid(2) . Si i et j sont dans les limites de l'image, la fonction calcule la couleur pixel de l'index. Pas de boucles. L'accélération de la parallélisation est d'environ 1 072, prenant environ 22,1124 millisecondes.
Selon l'outil nvprof CLI (dans Optimisations.txt), [CUDA memcpy HtoD] représente environ 36.09% de l'exécution. Pour contourner cela, le tableau de pixels peut être créé et initialisé sur l'appareil sans jamais être ajouté dans la mémoire côté CPU. numba.cuda fournit un device_array de fonction_Array pour le faire. L'accélération de la minimisation du transfert d'hôte à périphérique est d'environ 1,38, prenant environ 15,9563 millisecondes.
La prochaine optimisation utilise la mémoire partagée, la mémoire qu'un bloc de threads partage. Étant donné que la mémoire est spécifique au bloc, les vitesses de lecture et d'écriture sont plus rapides. Par conséquent, les opérations d'accès à la mémoire peuvent être calculées sur la mémoire partagée. Après les opérations, un accès lent au réseau de pixels global complète le calcul parallélisé. L'accélération de l'utilisation de la mémoire partagée est d'environ 1,068, prenant environ 14,9425 millisecondes.
L'accélération totale de l'algorithme CPU à l'algorithme GPU optimisé est d'environ 1 578.