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