[en] The task execution model is widely used in computer engineering, it helps developers to design, develop and understand software systems. OpenMP is the de-facto programming model to parallelize sequential algorithms on shared-memory machines. Coupled with the task parallelization, OpenMP is able to conveniently parallelize structured and non-structured applications, it also allows users to offload work onto accelerators as target tasks. However, the runtime overhead incurred by the OpenMP tasking model is an important concern for users to develop OpenMP task programs. This work focuses on improving OpenMP tasking model. Firstly, we carried out an analysis of the performance overhead and bottleneck of mainstream task implementations and proposed a solution in the OpenMP specification to tackle it. To elaborate, we observe that a significant portion of the overhead in the tasking model stems from thread contention, where multiple threads compete to access shared resources simultaneously, such as task queues, causing these threads to stall. As the number of cores in modern architectures increases, this further hampers the scalability of OpenMP tasking. We propose a mechanism that creates graphs representing sets of OpenMP tasks. Once built, executing such graphs incurs less runtime overhead by drastically reducing the access to shared resources. This mechanism is exposed to the users as a new OpenMP directive, namely Taskgraph. Secondly, we implemented the proposed solution, the taskgraph directive, in both GCC (prototype implementation) and LLVM compilers (complete implementation). Initially, our focus was on the GCC compiler, particularly its runtime system: libgomp. Our prototype implementation in this compiler demonstrated promising performance improvement using taskgraph. However, it also revealed a performance bottleneck in libgomp: all tasks are scheduled into a common queue, leading to significant contention and resulting in poor performance and scalability compared to LLVM. The complete implementation of the taskgraph framework is in the LLVM compiler. Our modifications in the compiler range from the front-end to the middle-end of the compiler, in addition to its runtime library: libomp. This framework allows users to declare taskgraph directives in OpenMP C/C++ code to create graphs conveniently, at either compile time or run-time. The experiments show that the taskgraph framework outperforms the original task implementations from GCC and LLVM. We carried out the experiments on nodes of the Marenostrum4 supercomputer. Finally, we enhance the OpenMP offloading mechanism by leveraging taskgraph. Particularly, we implemented the transformation of taskgraph to CUDA graphs. Consequently, our framework enhances the interoperability of OpenMP with other programming models (in this case, CUDA) and improves the performance of OpenMP accelerator model by alleviating the synchronization overhead. With these contributions, this thesis ameliorates both the OpenMP tasking and accelerator models. The framework has been used by other Ph. D. students to develop their research, for example, Cyril Cetre from Thales Research and Technology successfully improved the performance of a cyber-physical application by utilizing static generation of CUDA graphs, as presented in this manuscript. Furthermore, the OpenMP Language Committee accepted our proposition to include the taskgraph directive into the OpenMP Specification v6. 0. This thesis also contributed to the upstream LLVM repository. These commits are mainly focused on the record-and-replay mechanism of taskgraph, serving also as a basis for the official taskgraph implementation in the LLVM. We hope with these endeavors, this work will promote the use of OpenMP task in general.

[es] El modelo de ejecución de tareas se utiliza ampliamente en la ingeniería informática, ya que ayuda a los desarrolladores a diseñar, desarrollar y comprender sistemas de software. OpenMP es el modelo de programación de facto para paralelizar algoritmos secuenciales en máquinas de memoria compartida. Gracias a la paralelización de tareas, OpenMP puede ejecutar en paralelo aplicaciones estructuradas y no estructuradas, y también permite a los usuarios descargar tareas en aceleradores como «target tasks». Sin embargo, la sobrecarga en tiempo de ejecución que genera el modelo de tareas de OpenMP supone una preocupación importante para quienes desarrollan programas con OpenMP. Este trabajo se centra en mejorar el modelo de tareas de OpenMP.  En primer lugar, analizamos la sobrecarga de rendimiento y los cuellos de botella de las implementaciones de tareas más comunes, y propusimos una solución en la especificación de OpenMP para abordarlos. Observamos que gran parte de la sobrecarga del modelo de tareas proviene de la contención de hilos, donde varios hilos compiten simultáneamente por acceder a recursos compartidos, como las colas de tareas, lo que provoca estancamientos. A medida que aumenta el número de núcleos en las arquitecturas modernas, esto dificulta aún más la escalabilidad de las tareas en OpenMP. Proponemos un mecanismo que crea grafos que representan conjuntos de tareas de OpenMP. Una vez construidos, la ejecución de estos grafos genera menos sobrecarga en tiempo de ejecución al reducir drásticamente el acceso a recursos compartidos. Este mecanismo se expone a los usuarios mediante una nueva directiva de OpenMP, denominada Taskgraph.  En segundo lugar, implementamos la solución propuesta -la directiva taskgraph- tanto en el compilador GCC (implementación prototipo) como en LLVM (implementación completa). Nuestra implementación en GCC, enfocada en su sistema de tiempo de ejecución (libgomp), mostró una mejora de rendimiento prometedora, aunque también reveló un cuello de botella: todas las tareas se programan en una cola común, lo que provoca una contención significativa y un rendimiento y escalabilidad inferiores en comparación con LLVM. La implementación completa de taskgraph se realizó en LLVM, con modificaciones que abarcan desde el front-end hasta el middle-end y la biblioteca de tiempo de ejecución (libomp). Este marco permite a los usuarios declarar directivas taskgraph en código C/C++ de OpenMP para crear grafos de manera conveniente, tanto en tiempo de compilación como de ejecución. Los experimentos en nodos del superordenador Marenostrum4 demuestran que el framework taskgraph supera a las implementaciones originales de GCC y LLVM.  Por último, mejoramos el mecanismo de offloading de OpenMP aprovechando taskgraph, implementando la transformación de taskgraph en CUDA Graphs. Así, nuestro framework potencia la interoperabilidad de OpenMP con otros modelos de programación (en este caso CUDA) y mejora el rendimiento del modelo de aceleradores de OpenMP al reducir la sobrecarga de sincronización. Con estas contribuciones, esta tesis optimiza tanto el modelo de tareas como el de aceleradores de OpenMP, y esperamos que fomente el uso de las tareas en OpenMP en general.