Recientemente, NVIDIA ha introducido la gestión de memoria heterogénea (HMM) en sus controladores de kernel de código abierto , lo que simplifica el desarrollo de aplicaciones GPU con CUDA. Unifica el acceso a la memoria del sistema entre CPU y GPU y elimina la necesidad de copiar el contenido de la memoria entre la memoria de la CPU y la GPU. Extiende la Memoria Unificada para cubrir tanto la memoria asignada por el sistema como la memoria asignada por cudaMallocManaged()
.
Quizás se pregunte: "¿Cómo hago para que esto funcione en mi sistema?" Si es usuario de SUSE Linux Enterprise Server (SLES) o SUSE Linux Enterprise High Performance Computing (SLE HPC) 15 SP5, el controlador abierto ya está disponible para usted. Por lo tanto, si tiene un chipset NVIDIA con un procesador de sistema GPU (GSP), es decir. NVIDIA Turing o posterior, lo tenemos cubierto (usuarios de openSUSE Leap, consulten aquí ). Aquí es cómo:
Instalación en SLES/SLE HPC 15 SP5
Inicie sesión en su sistema como root.
Debido a la naturaleza modular de SLES, es necesario agregar dos módulos adicionales que no están habilitados de forma predeterminada (aunque sí están habilitados en SLE-HPC):
SUSEConnect -p sle-module-desktop-applications/15.5/x86_64nSUSEConnect -p sle-module-desarrollo-herramientas/15.5/x86_64n
Tenga en cuenta que su sistema SLE debe estar registrado para que estos comandos funcionen. En SLES y SLE HPC, agregue el módulo de computación NVIDIA ahora e instale los paquetes necesarios ejecutando:
SUSEConnect -p sle-module-NVIDIA-compute/15/x86_64nzypper --gpg-auto-import-keys actualizarnzypper -n install -y --auto-acuerdo-con-licencias --no-recomienda nvidia-open-gfxG05-kmp-default cudan
En caso de que necesite un arranque seguro o una implementación en un entorno de nube pública, es posible que desee aprovechar los controladores de kernel abierto G06, que están prediseñados y firmados por SUSE y se envían con SLE. Para instalar estos controladores, agregue un repositorio adicional con los siguientes comandos en lugar de los anteriores:
zypper ar https://download.nvidia.com/suse/sle15sp5/ NVIDIAnSUSEConnect -p sle-module-NVIDIA-compute/15/x86_64 --gpg-auto-import-keysnzypper --gpg-auto-import-keys actualizarnzypper -n in -y --auto-aceptar-con-licencias --no-recomienda nvidia-open-driver-G06-signed-kmp-default nvidia-drivers-minimal-G06 cudan
Esto elimina la necesidad de inscribir un MOK separado para el arranque seguro, así como una etapa de compilación separada cuando se instalan o actualizan los controladores del kernel. Ayuda a reducir el tamaño de las imágenes de la nube, ya que no se requieren herramientas de compilación adicionales. Instala paquetes de controladores de espacio de usuario que aún no están disponibles en el repositorio CUDA.
Preparación
Para conjuntos de chips con motor de visualización (es decir, que tienen salidas de visualización), el soporte de controlador abierto todavía se considera alfa. Por lo tanto, es posible que tengas que agregar o descomentar la siguiente opción en /etc/modprobe.d/50-nvidia-default.conf
:
opciones nvidia NVreg_OpenRmEnableUnsupportedGpus=1n
Una vez que se hayan realizado estos pasos, puede reiniciar el sistema o ejecutar:
modprobe nvidian
como root para cargar todos los módulos del kernel necesarios.
Probando la instalación
Para verificar si HMM está disponible y habilitado, consulte la propiedad 'Modo de direccionamiento':
nvidia-smi-q | grep DireccionamientonModo de direccionamiento: HMMn
Si ve el resultado anterior, HMM está disponible en su sistema.
Compilar código de muestra HMM
NVIDIA analiza algunos ejemplos de código para HMM en su publicación de blog . Los ejemplos se pueden encontrar aquí en GitHub . Algunos necesitan un gcc más nuevo que la versión estándar enviada con SLE 15, que puede instalar con:
zypper -n en -y gcc12-c++n
Para compilar los ejemplos, la PATH
variable de entorno debe extenderse para que apunte a los binarios de CUDA:
exportar RUTA=/usr/local/cuda/bin/:${RUTA}n
Ahora puede compilar los ejemplos en la ruta src
usando los siguientes comandos:
nvcc -std=c++20 -ccbin=/usr/bin/g++-12 atomic_flag.cpp -o atomic_flagnnvcc -std=c++20 -ccbin=/usr/bin/g++-12 file_after.cpp -o file_afternnvcc -std=c++20 -ccbin=/usr/bin/g++-12 file_before.cpp -o file_beforennvcc -std=c++20 -ccbin=/usr/bin/g++-12 ticket_lock.cpp -o ticket_lockn
Ejemplo de 'weather_app'
Para esta aplicación de ejemplo, el gcc
compilador del sistema es suficiente. Sólo se debe configurar $PATH en:
exportar RUTA=/usr/local/cuda/bin/:${RUTA}n
Ahora, construye el binario weather_app
ejecutando:
hacern
El blog de NVIDIA describe cómo obtener los datos necesarios para ejecutar la aplicación. Si no puede descargar ~1,3 TB de datos, también puede usar el generador de datos aleatorios de este PR en GitHub . La aplicación de datos aleatorios se puede compilar con:
g++ create_random_data.cpp -o create_random_data -O2 -Walln
La aplicación no tiene parámetros de línea de comando y el año de inicio y finalización de los datos aleatorios debe establecerse en el propio código fuente.
NOTA: Si su tarjeta gráfica no tiene suficiente VRAM para ejecutar el código de muestra original, puede reducir el tamaño de los datos reduciendo los parámetros input_grid_height
y input_grid_width
en create_random_data.cpp
y weather_app.cu
.
Para realizar una ejecución de muestra:
mkdir binario_1hr_alln./weather_appn./weather_app 1981 1982 binario_1hr_all/n
NOTA: No Makefile
compila kernels CUDA para las GPU NVIDIA Turing y también tiene un manejo de mensajes de error defectuoso. Es posible que desee consultar https://github.com/NVIDIA/HMM_sample_code/pull/2 , que soluciona estos problemas.
Resumen