Використання gpu на кластері, cuda, паралельні обчислення в уро ран

На кластері "Уран" (umt) введені в експлуатацію обчислювальні вузли, оснащені прискорювачами NVIDIA Tesla. На одному вузлі може бути одночасно запущено до 8 завдань, кожному у тому числі виділяється один або кілька графічних процесорів.

Для роботи з GPU можна використовувати
1) технологію CUDA;
2) pragma-програмування, що надається С- і Fortran-компіляторами PGI (наприклад, директиви OpenACC);
3) систему Matlab.
Запуск задач на графічних процесорах здійснюється в системі SLURM (див. Запуск завдань на кластері в системі SLURM) з використанням команди запуску з опцією --gres = gpu: N.
Компіляція і запуск додатків для GPU з PGI Accelerator і OpenACC. а також запуск програм з використанням GPU в системі Matlab розглядаються в окремих інструкціях.
Нижче розглядається компіляція програм і технологія CUDA.

Компіляція програм і технологія CUDA

Свіжа версія бібліотеки CUDA знаходиться в каталозі / opt / cuda /.

/ Opt / cuda / include / - заголовки;
/ Opt / cuda / lib / - бібліотека CUDA;
/ Opt / cuda / doc / - документація.
Щоб використовувати бібліотеку CUDA, необхідно при компіляції програми замовити дану бібліотеку, наприклад:
gcc mytest.c -o mytest -lcuda -L / opt / cuda / lib -I / opt / cuda / include
Можна використовувати компілятор nvcc.
nvcc <имя файла для компиляции> -o <имя выходного файла>
На кластері "Уран" при виконанні даної команди за замовчуванням підключається бібліотека CUDA. Можна компілювати програми на мовах C і C ++ (файли з розширенням .c і .cpp) і програми, написані з використанням технології CUDA (файли з розширенням .cu), наприклад:
u9999 @ umt:

$ Nvcc main.c -o gputest

приклад
Нехай файл cuda_test.cu (з домашнього каталогу) містить програму на CUDA:
#include
#include
int main () int GPU_N;
int dev;
cudaGetDeviceCount (GPU_N);
printf ( "Device count:. \ n", GPU_N);
for (dev = 0; dev cudaGetDeviceProperties (deviceProp, dev);
printf ( "PCI Bus id:. \ n", deviceProp.pciBusID);
>
return 0;
>
Тоді компіляція програми і запуск завдання на кластері можуть мати вигляд:
u9999 @ umt:

$ Nvcc cuda_test.cu -o cuda_test
u9999 @ umt:

$ Srun --gres = gpu: 1 ./cuda_test
Device count: 1
PCI Bus id: 8
u9999 @ umt:

$ Srun --gres = gpu: 2 ./cuda_test
Device count: 2
PCI Bus id: 10
PCI Bus id: 26