Comparativa del rendimiento de una GPU usando OpenMP, OpenACC o CUDA mediante el ejemplo de Mandelbrot

Este Trabajo de Fin de Grado se centra en la comparación de distintos frameworks de programación de GPUs de NVIDIA con C: OpenMP, OpenACC y CUDA. Estos dos primeros se centran en el uso de directivas de compilador y permiten paralelizar un programa con el añadido de unas pocas líneas. El último permite un control más preciso de la paralelización a costa de una curva de aprendizaje más inclinada y el requerimiento de una modificación mayor del código original. Además, también se compararán distintos compiladores para ver cuáles optimizan mejor cada framework mencionado. Concretamente, se evaluarán GCC, ICX, NVC, NVCC y Clang. Para la comparación, se empezará con un ejemplo sencillo: el programa pi, que calcula el número π usando aproximaciones numéricas de una integral. Esto permitirá ver cómo deben de usarse los compiladores y qué opciones necesitan para compilar los frameworks. Después, se utilizará un programa más complejo para hacer debidamente la comparación: mandelbrot, que genera imágenes del Conjunto de Mandelbrot. Con ello, se podrá ver no sólo el rendimiento de cada combinación framework -compilador, si no también detalles como la dificultad de implementación o los problemas que tiene cada compilador.
ABSTRACT
This Trabajo de Fin de Grado is centered around the comparison between various programming frameworks for NVIDIA GPUs using C: OpenMP, OpenACC and CUDA. The first two are focused on the use of compiler directives and allow parallelizing a program by just adding a few lines of code. The latter allows for more precise control over the parallelization at the expense of a steeper learning curve and the necessity to modify the original code more. Furthermore, various compilers will also be compared to see which of them optimizes each framework better. Specifically, GCC, ICX, NVC, NVCC and Clang will be used. For the comparison, we will first start with a simple example: the pi program, which calculates the number π using numerical approximations of an integral. This will allow us to see how the compilers have to be used and what flags they need to compile the frameworks. Afterwards, we will use a more complex program to properly make the comparison: mandelbrot, which generates images of the Mandelbrot set. With this, it will be possible to see not only the performance of each framework-compiler combination, but also details like the difficulty of implementation or the problems each compiler has.

​Este Trabajo de Fin de Grado se centra en la comparación de distintos frameworks de programación de GPUs de NVIDIA con C: OpenMP, OpenACC y CUDA. Estos dos primeros se centran en el uso de directivas de compilador y permiten paralelizar un programa con el añadido de unas pocas líneas. El último permite un control más preciso de la paralelización a costa de una curva de aprendizaje más inclinada y el requerimiento de una modificación mayor del código original. Además, también se compararán distintos compiladores para ver cuáles optimizan mejor cada framework mencionado. Concretamente, se evaluarán GCC, ICX, NVC, NVCC y Clang. Para la comparación, se empezará con un ejemplo sencillo: el programa pi, que calcula el número π usando aproximaciones numéricas de una integral. Esto permitirá ver cómo deben de usarse los compiladores y qué opciones necesitan para compilar los frameworks. Después, se utilizará un programa más complejo para hacer debidamente la comparación: mandelbrot, que genera imágenes del Conjunto de Mandelbrot. Con ello, se podrá ver no sólo el rendimiento de cada combinación framework -compilador, si no también detalles como la dificultad de implementación o los problemas que tiene cada compilador.
ABSTRACT
This Trabajo de Fin de Grado is centered around the comparison between various programming frameworks for NVIDIA GPUs using C: OpenMP, OpenACC and CUDA. The first two are focused on the use of compiler directives and allow parallelizing a program by just adding a few lines of code. The latter allows for more precise control over the parallelization at the expense of a steeper learning curve and the necessity to modify the original code more. Furthermore, various compilers will also be compared to see which of them optimizes each framework better. Specifically, GCC, ICX, NVC, NVCC and Clang will be used. For the comparison, we will first start with a simple example: the pi program, which calculates the number π using numerical approximations of an integral. This will allow us to see how the compilers have to be used and what flags they need to compile the frameworks. Afterwards, we will use a more complex program to properly make the comparison: mandelbrot, which generates images of the Mandelbrot set. With this, it will be possible to see not only the performance of each framework-compiler combination, but also details like the difficulty of implementation or the problems each compiler has. Read More