Nvidia OpenACC

Az OpenACC API lehetővé teszi a programozó számára, hogy meg tudja mondani a fordítónak az információkat, annak érdekében, hogy a CPU-ról levegye a terhelést és azt áttegye a csatlakoztatott gyorsítóeszközre. Az OpenACC direktívák Nvidia GPU környezetben is támotatottak. A CCE teljes mértékig támogatja a OpenACC 2.0 szabványt, részben a 2.x és 3.x verziókat, de azt csak Fortran fordítóhoz.

Nvidia OpenACC Példa program

Az alábbi példa program tartalmaz egy alap OpenACC funkció használtatot:

#include <stdio.h>
#include <unistd.h>

#define N 1000
int array[N];
int main() {
char hostname[256];
gethostname(hostname, sizeof(hostname));
#pragma acc parallel loop copy(array[0:N])
   for(int i = 0; i < N; i++) {
      array[i] = 3.0;
   }
   printf("Success on node %s!\n",hostname);
}

További példák több GPU kihasználásához az alábbi linken találhatók: https://enccs.github.io/gpu-programming/8-multiple_gpu/#hybrid-mpi-openacc-openmp-with-gpu-awareness-approach

OpenACC Nvidia

A fordításhoz meg kell adni a -acc kapcsolót.

module swap PrgEnv-cray PrgEnv-nvhpc
cc openacc-nvidia.c -o openacc-nvidia -mp=gpu -gpu=cc80 -acc

Az OpenACC-vel törénő dinamikus linkelést az alábbiak szerint lehet ellenőrizni:

$ ldd openacc-nvidia | grep acc
     libacchost.so => /scratch/software/packages/nvhpc/Linux_x86_64/23.11/compilers/lib/libacchost.so (0x00007fa64f5f2000)
     libaccdevaux.so => /scratch/software/packages/nvhpc/Linux_x86_64/23.11/compilers/lib/libaccdevaux.so (0x00007fa64f3d6000)
     libaccdevice.so => /scratch/software/packages/nvhpc/Linux_x86_64/23.11/compilers/lib/libaccdevice.so (0x00007fa64f0aa000)

OpenACC Batch Job

A példa program beküldése 4 gépre 8 taskot használva:

#!/bin/bash
#SBATCH -A hpcteszt
#SBATCH --partition=ai
#SBATCH --job-name=openacc-nvidia
#SBATCH --output=openacc-nvidia.out
#SBATCH --time=06:00:00
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=8
#SBATCH --gres=gpu:1
srun ./openacc-nvidia