Simple Science

Ciencia de vanguardia explicada de forma sencilla

# Informática# Computación distribuida, paralela y en clústeres

Kernel Launcher: Simplificando el desarrollo de código GPU

Una nueva herramienta simplifica la creación y optimización de aplicaciones CUDA para mejorar el rendimiento de la GPU.

― 8 minilectura


Optimiza tus aplicacionesOptimiza tus aplicacionesCUDAla GPU con Kernel Launcher.Mejora sin esfuerzo el rendimiento de
Tabla de contenidos

Las Unidades de Procesamiento Gráfico (GPUs) se usan mucho en computación científica, pero escribir código eficiente para estos dispositivos puede ser complicado. Los programadores a menudo necesitan ajustar su código para lograr el mejor rendimiento. Como solución, se han creado herramientas como Kernel Tuner para ayudar a automatizar el proceso de encontrar la mejor configuración para el código de la GPU. Sin embargo, estas herramientas a menudo no ayudan a los programadores a integrar los resultados de vuelta en sus aplicaciones, lo que puede llevar a más trabajo para los desarrolladores.

Este artículo presenta una nueva herramienta llamada Kernel Launcher. Esta es una librería de C++ que busca facilitar a los desarrolladores la creación de aplicaciones CUDA que estén bien optimizadas para el rendimiento. Con Kernel Launcher, los programadores pueden capturar cómo se ejecuta su código, ajustarlo para diferentes configuraciones y luego integrar esas mejoras fácilmente en sus aplicaciones.

El Desafío de Escribir Código para GPUs

Programar para GPUs presenta su propio conjunto de desafíos. La necesidad de escribir funciones especializadas para la GPU, llamadas kernels, que ejecutan miles de tareas al mismo tiempo complica las cosas. Cómo repartir el trabajo entre estas tareas juega un papel clave para conseguir un buen rendimiento. Además, los sistemas de memoria en las GPUs son complejos, y cómo se almacenan y acceden a los datos puede afectar significativamente la velocidad.

Además, optimizar el código de la GPU no es sencillo. A veces, mejorar el rendimiento en una situación puede no ayudar en otra. Varias estrategias, como desenrollar bucles o usar múltiples puntos de datos en un solo hilo, pueden influir en cómo se ejecuta el código dependiendo de la GPU específica y del tamaño de los datos que se procesan.

El Papel de las Herramientas de Auto-Tuning

Las herramientas de auto-tuning ayudan a optimizar el código de la GPU buscando automáticamente los mejores ajustes, pero a menudo requieren que los programadores manejen manualmente la integración de los resultados en sus aplicaciones. Kernel Tuner, por ejemplo, permite a los desarrolladores especificar el código y los parámetros de ajuste en scripts de Python. La herramienta luego explora diferentes configuraciones para encontrar la que mejor funciona para una configuración dada.

Sin embargo, los desarrolladores generalmente deben ajustar su código para configuraciones específicas, lo que podría no funcionar bien en diferentes escenarios. Esto significa que el rendimiento óptimo para una GPU o conjunto de datos podría no traducirse efectivamente a otra. Crear una aplicación que sea portátil en cuanto al rendimiento-una que funcione bien en varias configuraciones-requiere a menudo un ajuste extenso.

Presentando Kernel Launcher

Kernel Launcher está diseñado para abordar estos problemas simplificando cómo se desarrollan y optimizan las aplicaciones CUDA. Permite a los programadores definir sus kernels directamente en C++ y captura todos los detalles necesarios para el ajuste. Esto realmente agiliza el proceso y reduce la cantidad de código adicional que los desarrolladores deben manejar.

Características Clave de Kernel Launcher

  1. Definición y Captura de Kernels: Los programadores pueden definir sus kernels usando la API de Kernel Launcher. Esta definición incluye los parámetros ajustables y sus posibles valores, dejando clara qué se puede optimizar. Cuando se ejecuta el kernel, captura toda la información relevante necesaria para el ajuste.

  2. Ajuste Automático con Kernel Tuner: Después de capturar el lanzamiento del kernel, Kernel Launcher trabaja con Kernel Tuner para encontrar la mejor configuración de rendimiento. Los resultados se guardan en un archivo conocido como archivo de sabiduría. Este archivo contiene varias configuraciones y sus métricas de rendimiento.

  3. Selección Dinámica de Kernels: Cuando llega el momento de ejecutar la aplicación, Kernel Launcher puede seleccionar la mejor configuración para la configuración actual en tiempo real. Compila el código del kernel necesario dinámicamente, por lo que no se necesita precompilar varias configuraciones.

  4. Portabilidad de Rendimiento: La combinación de kernels ajustables y compilación en tiempo de ejecución significa que las aplicaciones que usan Kernel Launcher pueden adaptarse a diferentes configuraciones de GPU y tamaños de datos, logrando un buen rendimiento sin necesidad de ajustes manuales frecuentes.

Ejemplo de Aplicación: MicroHH

Para mostrar qué tan bien funciona Kernel Launcher, se ha integrado en MicroHH, un paquete de software utilizado para simular dinámicas de fluidos. Este software puede ejecutarse tanto en CPUs como en GPUs, y maneja varios parámetros como tamaño de la cuadrícula y precisión. MicroHH es una buena opción para la selección de kernels en tiempo de ejecución porque tiene muchas combinaciones de parámetros que necesitan ser ajustadas para un rendimiento óptimo.

Se eligieron dos kernels específicos de MicroHH para un análisis más profundo. El primero, llamado advec_u, realiza operaciones en puntos de cuadrícula y es parte de un esquema de advección. El segundo, diff_uvw, es una operación elemento a elemento utilizada en simulaciones de difusión.

Parámetros Ajustables

Los kernels fueron modificados para incluir varios parámetros ajustables. Estos parámetros ayudan a definir cómo están organizados los hilos y cómo se asigna el trabajo a cada hilo de la GPU.

  • Tamaño de Bloque: Esto se refiere a cuántos hilos se agrupan juntos al ejecutar operaciones.
  • Factor de Tiling: Esto permite que cada hilo procese múltiples puntos de cuadrícula, lo que puede mejorar la eficiencia.
  • Desenrollado de Bucles: Esta es una técnica que puede acelerar el código expandiendo los bucles.
  • Tiling Stride: Esto afecta cómo los puntos de datos se asignan a los hilos.
  • Permutación de Desenredo: Esto determina el orden de programación de los bloques de hilo y puede impactar el rendimiento.
  • Hilos por Multiprocesador de Streaming (SM): Esto controla cuántos hilos pueden ejecutarse en una sola unidad de procesamiento de la GPU, equilibrando rendimiento y uso de recursos.

El Proceso de Usar Kernel Launcher

Comenzar con Kernel Launcher implica varios pasos.

  1. Definir los Kernels: Los desarrolladores crean sus definiciones de kernels utilizando la API. Esto incluye especificar parámetros ajustables y valores permitidos.

  2. Capturar los Kernels: Configurando una variable de entorno, los programadores pueden capturar lanzamientos de kernels junto con los datos de entrada automáticamente. Esto simplifica el proceso de recopilar la información necesaria para el ajuste.

  3. Ajustar Usando Kernel Tuner: Los kernels capturados pueden ser ajustados utilizando las capacidades de Kernel Tuner. Las mejores configuraciones se almacenan en archivos de sabiduría.

  4. Seleccionar y Compilar en Tiempo de Ejecución: Cuando se ejecuta la aplicación, Kernel Launcher revisa el archivo de sabiduría, selecciona la mejor configuración para la GPU y el tamaño del problema actuales, y compila el kernel dinámicamente.

Evaluación Experimental

Se realizó una evaluación de Kernel Launcher utilizando el software MicroHH. Se probó el rendimiento de dos GPUs diferentes, el A100 y el A4000. Cada GPU tiene sus fortalezas y algunas variaciones en el rendimiento, lo que ayuda a demostrar la efectividad de usar Kernel Launcher.

Resultados de Rendimiento

Kernel Launcher mostró mejoras significativas en el rendimiento. En escenarios donde las configuraciones se optimizaron para configuraciones específicas, se observaron ganancias sustanciales. Por ejemplo, al usar la mejor configuración encontrada a través de auto-tuning, las mejoras se pudieron ver claramente en comparación con el uso de configuraciones predeterminadas (no ajustadas).

Sin embargo, se hizo evidente que una configuración optimizada para un escenario no necesariamente funcionaba bien para otro. Esto indicó la importancia de ajustar para diferentes configuraciones.

Conclusión

Kernel Launcher es una herramienta valiosa para los desarrolladores que trabajan con aplicaciones CUDA, especialmente en el ámbito de la computación científica. Al simplificar el proceso de definición de kernels, captura, ajuste y compilación en tiempo de ejecución, hace que crear aplicaciones que sean portátiles en cuanto a rendimiento sea más factible. A través de su integración con Kernel Tuner y su uso inteligente de archivos de sabiduría, Kernel Launcher automatiza muchas tareas complejas, permitiendo a los desarrolladores enfocarse en sus aplicaciones centrales en lugar de pasar un tiempo excesivo en optimización.

Con la complejidad continua de las GPUs y sus arquitecturas, tener herramientas como Kernel Launcher será crucial para asegurar que las aplicaciones puedan aprovechar al máximo las capacidades de hardware disponibles. A medida que la computación científica sigue creciendo en importancia y complejidad, las herramientas que simplifican los procesos de desarrollo serán más críticas que nunca.

Fuente original

Título: Kernel Launcher: C++ Library for Optimal-Performance Portable CUDA Applications

Resumen: Graphic Processing Units (GPUs) have become ubiquitous in scientific computing. However, writing efficient GPU kernels can be challenging due to the need for careful code tuning. To automatically explore the kernel optimization space, several auto-tuning tools - like Kernel Tuner - have been proposed. Unfortunately, these existing auto-tuning tools often do not concern themselves with integration of tuning results back into applications, which puts a significant implementation and maintenance burden on application developers. In this work, we present Kernel Launcher: an easy-to-use C++ library that simplifies the creation of highly-tuned CUDA applications. With Kernel Launcher, programmers can capture kernel launches, tune the captured kernels for different setups, and integrate the tuning results back into applications using runtime compilation. To showcase the applicability of Kernel Launcher, we consider a real-world computational fluid dynamics code and tune its kernels for different GPUs, input domains, and precisions.

Autores: Stijn Heldens, Ben van Werkhoven

Última actualización: 2023-03-22 00:00:00

Idioma: English

Fuente URL: https://arxiv.org/abs/2303.12374

Fuente PDF: https://arxiv.org/pdf/2303.12374

Licencia: https://creativecommons.org/licenses/by-nc-sa/4.0/

Cambios: Este resumen se ha elaborado con la ayuda de AI y puede contener imprecisiones. Para obtener información precisa, consulte los documentos originales enlazados aquí.

Gracias a arxiv por el uso de su interoperabilidad de acceso abierto.

Más de autores

Artículos similares