Использование 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 <cuda.h>
#include <stdio.h>
int main() {
  int GPU_N;
  int dev;
  cudaGetDeviceCount(&GPU_N);
  printf("Device count: %d\n", GPU_N);
  for(dev=0;dev<GPU_N;dev++) {
    cudaDeviceProp deviceProp;
    cudaGetDeviceProperties(&deviceProp, dev);
    printf("PCI Bus id: %d\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

Поддержка CUDA есть в компиляторе Portland Group.
Инструкции по использованию CUDA в Фортране можно найти на сайте Portland Group (http://www.pgroup.com/resources/cudafortran.htm).
Для компиляции Fortran-программы с CUDA следует установить переменные окружения командой module или mpiset, выбрав связку MVAPICH+PGI, например:
    module switch mpi/default mvapich2/pgi_12.10

или соответственно
    mpiset 7

и откомпилировать программу компилятором pgfortran с опцией -Mcuda, указав при необходимости оптимизированные библиотеки, например:
    pgfortran -o mytest test.cuf -Mcuda -lcublas