Форма поиска

 

Библиотеки. GPGPU

Расположение библиотеки CUDA:
9.0 /usr/local/cuda/
8.0 /usr/local/CUDA/8.0
7.0 /usr/local/CUDA/7.0
6.0 /usr/local/CUDA/6.0

Поддержка в компиляторах:

Технология Язык Компилятор
CUDA CUDA C Nvidia: nvcc
CUDA Fortran PGI: pgfortran
OpenCL OpenCL C Nvidia: clcc
OpenACC C, C++ и Fortran PGI, GCC (>= 5.0)

 

Содержание:

 
Введение в технологию GPGPU
GPGPU (англ. General-purpose computing for graphics processing units, неспециализированные вычисления на графических процессорах) — техника использования графического процессора видеокарты, который обычно имеет дело с вычислениями только для компьютерной графики, чтобы выполнять расчёты в приложениях для общих вычислений, которые обычно проводит центральный процессор. Это стало возможным благодаря добавлению программируемых шейдерных блоков и более высокой арифметической точности растровых конвейеров, что позволяет разработчикам ПО использовать потоковые процессоры для не-графических данных.
  
Реализации:
1) CUDA — технология GPGPU, позволяющая программистам реализовывать на языке программирования Си (а также C++/C#) алгоритмы, выполнимые на графических процессорах ускорителей GeForce восьмого поколения и новее. Технология CUDA разработана компанией Nvidia.
3) OpenCL - является языком программирования задач, связанных с параллельными вычислениями на различных графических и центральных процессорах.
5) OpenACC  — стандарт, описывающий набор директив для написания гетерогенных программ, задействующих как центральный, так и графический процессор. Используется для распараллеливания программ на языках C, C++ и Fortran. Стандарт был создан группой, в которую вошли CAPS, Cray, NVIDIA и PGI.
 
CUDA
CUDA SDK позволяет программистам реализовывать на специальном упрощённом диалекте языка программирования Си алгоритмы, выполнимые на графических процессорах Nvidia, и включать специальные функции в текст программы на Си. Архитектура CUDA даёт разработчику возможность по своему усмотрению организовывать доступ к набору инструкций графического ускорителя и управлять его памятью.
OpenCL
OpenCL (от англ. Open Computing Language — открытый язык вычислений) — фреймворк для написания компьютерных программ, связанных с параллельными вычислениями на различных графических и центральных процессорах, а также FPGA. В OpenCL входят язык программирования, который основан на стандарте языка программирования Си C99, и интерфейс программирования приложений. OpenCL обеспечивает параллелизм на уровне инструкций и на уровне данных и является осуществлением техники GPGPU. OpenCL является полностью открытым стандартом, его использование не облагается лицензионными отчислениями.
 
OpenACC
OpenACC (от англ. Open Accelerators) — программный стандарт для параллельного программирования, разрабатываемый совместно компаниями Cray, CAPS, Nvidia и PGI. Стандарт описывает набор директив компилятора, предназначенных для упрощения создания гетерогенных параллельных программ, задействующих как центральный, так и графический процессор[1][2].
 
Как и более ранний стандарт OpenMP, OpenACC используется для аннотирования фрагментов программ на языках C, C++ и Fortran. С помощью набора директив компилятора программист отмечает участки кода, которые следует выполнять параллельно или на графическом процессоре, обозначает какие из переменных являются общими, а какие индивидуальными для потока и т. п[3]. По синтаксису схож с OpenMP[4]. Стандарт OpenACC позволяет программисту абстрагироваться от особенностей инициализации графического процессора, вопросов передачи данных на сопроцессор и обратно и т. д.
 
Пример 1 - сборка CUDA-программы при помощи компилятора nvcc и запуск на Nvidia Tesla k40 (кластер Huawei)
$ CUDA_PATH=/usr/local/cuda
$ CUDA_TEST_PATH=$CUDA_PATH/samples/1_Utilities/bandwidthTest/
$ export PATH=/usr/local/cuda/bin/:$PATH
$ CUDA_INC_PATH=/usr/local/cuda/samples/common/inc
$
$ nvcc $CUDA_TEST_PATH/bandwidthTest.cu -I$CUDA_INC_PATH
$
$ ./a.out
[CUDA Bandwidth Test] - Starting...
Running on...
 
 Device 0: Tesla K40m
 Quick Mode
 
 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     10152.7
 
 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     10269.2
 
 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     183668.1
 
Result = PASS
 
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
$