El propósito del script Spirals es crear una imagen generada por computadora. La imagen se asigna a GPU con soporte CUDA.
Los siguientes son ejemplos de imágenes creadas con el script de Python. Sus detalles de configuración se pueden encontrar en la carpeta de ejemplos con otros ejemplos.
Para ejecutar el script de Python, se deben instalar las siguientes dependencias:
Cuando se ejecuta secuencialmente en un Intel i7-9700K, cada imagen toma aproximadamente 23.5877081 segundos.
El primer paso para optimizar el algoritmo CGI fue reconstruir el algoritmo para su uso paralelo en la GPU. Esto se hizo usando el decorador @cuda.jit , que requiere la invocación del núcleo. Antes de que el algoritmo se ejecute, el código determina cómo mapear una matriz de píxeles en el hardware de la GPU. En el algoritmo, los bucles para calcular cada píxel se reemplazan con i, j = cuda.grid(2) . Si i y j están dentro de los límites de la imagen, la función calcula el color de píxeles del índice. Sin bucles. La aceleración de la paralelización es de alrededor de 1.072, con aproximadamente 22.1124 milisegundos.
De acuerdo con la herramienta nvprof CLI (en Optimizations.txt), [CUDA memcpy HtoD] representa aproximadamente 36.09% de la ejecución. Para evitar esto, la matriz de píxeles se puede crear e inicializar en el dispositivo sin agregarse en la memoria del lado de la CPU. numba.cuda proporciona una función device_array para hacerlo. La aceleración de minimizar la transferencia de host-to en disposición es de alrededor de 1.38, con aproximadamente 15.9563 milisegundos.
La siguiente optimización utiliza la memoria compartida, la memoria que comparte un bloque de hilos. Dado que la memoria es específica del bloque, las velocidades de lectura y escritura son más rápidas. Por lo tanto, las operaciones de acceso a la memoria se pueden calcular en la memoria compartida. Después de las operaciones, un acceso lento a la matriz de píxeles global completa el cálculo paralelo. La aceleración del uso de memoria compartida es de alrededor de 1.068, con aproximadamente 14.9425 milisegundos.
La aceleración total del algoritmo de CPU al algoritmo de GPU optimizado es de aproximadamente 1,578.