CUDA

CUDA ( англ. Compute Unified Device Architecture ) - Програмно-апаратна архітектура паралельних обчислень, яка дозволяє істотно збільшити обчислювальну продуктивність завдяки використанню графічних процесорів фірми NVIDIA.

CUDA SDK дозволяє програмістам реалізовувати на спеціальному спрощеному діалекті мови програмування Сі алгоритми, здійснимі на графічних процесорах NVIDIA, і включати спеціальні функції в текст програми на Cи. Архітектура CUDA дає розробникові можливість на свій розсуд організовувати доступ до набору інструкцій графічного прискорювача і управляти його пам'яттю.


1. Програмна архітектура

Первісна версія CUDA SDK була представлена 15 лютого 2007. В основі інтерфейсу програмування додатків CUDA лежить мова Сі з деякими обмеженнями. Для успішної трансляції коду на цій мові, до складу CUDA SDK входить власний Сі-компілятор командного рядка nvcc компанії Nvidia. Компілятор nvcc створений на основі відкритого компілятора Open64 і призначений для трансляції host-коду (головного, керуючого коду) і device-коду (апаратного коду) (файлів з ​​розширенням. cu) в об'єктні файли, придатні в процесі збірки кінцевої програми або бібліотеки в будь-якому середовищі програмування, наприклад в NetBeans.

В архітектурі CUDA використовується модель пам'яті грід, кластерне моделювання потоків і SIMD -інструкції. Застосовна не тільки для високопродуктивних графічних обчислень, але і для різних наукових обчислень з використанням відеокарт nVidia. Науковці та дослідники широко використовують CUDA в різних областях, включаючи астрофізику, обчислювальну біологію та хімію, моделювання динаміки рідин, електромагнітних взаємодій, комп'ютерну томографію, сейсмічний аналіз і багато іншого. У CUDA є можливість підключення до додатків, що використовують OpenGL і Direct3D. CUDA - багатоплатформовий програмне забезпечення для таких операційних систем як Linux, Mac OS X і Windows.

22 березня 2010 nVidia випустила CUDA Toolkit 3.0, який містив підтримку OpenCL. [1]


2. Обладнання

Платформа CUDA Вперше з'явилися на ринку з виходом чіпа NVIDIA восьмого покоління G80 і стала присутньою у всіх наступних серіях графічних чіпів, які використовуються в сімействах прискорювачів GeForce, Quadro і NVidia Tesla.

Перша серія обладнання, підтримуюча CUDA SDK, G8x, мала 32-бітний векторний процесор одинарної точності, що використовує CUDA SDK як API (CUDA підтримує тип double double мови Сі, однак зараз його точність знижена до 32-бітного з плаваючою комою). Пізніші процесори GT200 мають підтримку 64-бітної точності (тільки для SFU), але продуктивність значно гірше, ніж для 32-бітної точності (через те, що SFU всього два на кожен потоковий мультипроцесор, а скалярних процесорів - вісім). Графічний процесор організовує апаратну багатопоточність, що дозволяє задіяти всі ресурси графічного процесора. Таким чином, відкривається перспектива перекласти функції фізичного прискорювача на графічний прискорювач (приклад реалізації - nVidia PhysX). Також відкриваються широкі можливості використання графічного обладнання комп'ютера для виконання складних неграфічних обчислень: наприклад, в обчислювальної біології та в інших галузях науки.


3. Переваги

У порівнянні з традиційним підходом до організації обчислень загального призначення допомогою можливостей графічних API, у архітектури CUDA відзначають наступні переваги в цій області:

  • Інтерфейс програмування додатків CUDA (CUDA API) заснований на стандартній мові програмування Сі з деякими обмеженнями. На думку розробників, це повинно спростити і згладити процес вивчення архітектури CUDA [2]
  • Колективна між потоками пам'ять (shared memory) розміром в 16 Кб може бути використана під організований користувачем кеш з більш широкою смугою пропускання, ніж при вибірці із звичайних текстур
  • Більш ефективні транзакції між пам'яттю центрального процесора і відеопам'яттю
  • Повна апаратна підтримка цілочисельних і побітових операцій
  • Підтримка компіляції GPU коду засобами відкритого LLVM [3]

4. Обмеження

  • Всі функції, здійснимі на пристрої, не підтримують рекурсії (у версії CUDA Toolkit 3.1 підтримує покажчики і рекурсію) і мають деякі інші обмеження

5. Підтримувані GPU і графічні прискорювачі [4]

Перелік пристроїв від виробника обладнання Nvidia із заявленою повною підтримкою технології CUDA наведено на офіційному сайті Nvidia: CUDA-Enabled GPU Products (Англ.) .

Фактично ж, в даний час на ринку апаратних засобів для ПК підтримку технології CUDA забезпечують наступні периферійні пристрої [4] :

Версія специфікації GPU Відеокарти
1.0 G80, G92, G92b, G94, G94b GeForce 8800GTX/Ultra, 9400GT, 9600GT, 9800GT, Tesla C/D/S870, FX4/5600, 360M, GT 420
1.1 G86, G84, G98, G96, G96b, G94, G94b, G92, G92b GeForce 8400GS/GT, 8600GT/GTS, 8800GT/GTS, 9600 GSO, 9800GTX/GX2, GTS 250, GT 120/30/40, FX 4/570, 3/580, 17/18/3700, 4700x2, 1xxM, 32 / 370M, 3/5/770M, 16/17/27/28/36/37/3800M, NVS420/50
1.2 GT218, GT216, GT215 GeForce 210, GT 220/40, FX380 LP, 1800M, 370/380M, NVS 2/3100M
1.3 GT200, GT200b GeForce GTX 260, GTX 275, GTX 280, GTX 285, GTX 295, Tesla C/M1060, S1070, Quadro CX, FX 3/4/5800
2.0 GF100, GF110 GeForce (GF100) GTX 465, GTX 470, GTX 480, Tesla C2050, C2070, S/M2050/70, Quadro Plex 7000, Quadro 4000, 5000, 6000, GeForce (GF110) GTX 560 TI 448, GTX570, GTX580, GTX590
2.1 GF104, GF114, GF116, GF108, GF106 GeForce 610M, GT 430, GT 440, GT 640, GTS 450, GTX 460, GTX 550 Ti, GTX 560, GTX 560 Ti, 500M, Quadro 600, 2000
3.0 GK104, GK106, GK107 GeForce GTX 690, GTX 680, GTX 670, GTX 660 Ti, GTX 660, GTX 650 Ti, GTX 650, GeForce GTX 680MX, GeForce GTX 680M, GeForce GTX 675MX, GeForce GTX 670MX, GTX 660M, GeForce GT 650M, GeForce GT 645M , GeForce GT 640M
3.5 GK110 nVidia GTX Titan
Nvidia GeForce для настільних комп'ютерів
GeForce GTX 590
GeForce GTX 580
GeForce GTX 570
GeForce GTX 560 Ti
GeForce GTX 560
GeForce GTX 550 Ti
GeForce GTX 520 [5]
GeForce GTX 480
GeForce GTX 470
GeForce GTX 465
GeForce GTX 460
GeForce GTS 450
GeForce GTX 295
GeForce GTX 285
GeForce GTX 280
GeForce GTX 275
GeForce GTX 260
GeForce GTS 250
GeForce GT 240
GeForce GT 220
GeForce 210
GeForce GTS 150
GeForce GT 130
GeForce GT 120
GeForce G100
GeForce 9800 GX2
GeForce 9800 GTX +
GeForce 9800 GTX
GeForce 9800 GT
GeForce 9600 GSO
GeForce 9600 GT
GeForce 9500 GT
GeForce 9400 GT
GeForce 9400 mGPU
GeForce 9300 mGPU
GeForce 8800 GTS 512
GeForce 8800 GT
GeForce 8600 GTS
GeForce 8600 GT
GeForce 8500 GT
GeForce 8400 GS
Nvidia GeForce для мобільних комп'ютерів
GeForce GTX 580M
GeForce GTX 570M
GeForce GTX 560M
GeForce GT 555M
GeForce GT 540M
GeForce GT 525M
GeForce GT 520M
GeForce GTX 485M
GeForce GTX 480M
GeForce GTX 470M
GeForce GTX 460M
GeForce GT 445M
GeForce GT 435M
GeForce GT 425M
GeForce GT 420M
GeForce GT 415M
GeForce GTX 285M
GeForce GTX 280M
GeForce GTX 260M
GeForce GTS 360M
GeForce GTS 350M
GeForce GTS 160M
GeForce GTS 150M
GeForce GT 335M
GeForce GT 330M
GeForce GT 325M
GeForce GT 240M
GeForce GT 130M
GeForce G210M
GeForce G110M
GeForce G105M
GeForce 310M
GeForce 305M
GeForce 9800M GTX
GeForce 9800M GT
GeForce 9800M GTS
GeForce 9700M GTS
GeForce 9700M GT
GeForce 9650M GS
GeForce 9600M GT
GeForce 9600M GS
GeForce 9500M GS
GeForce 9500M G
GeForce 9300M GS
GeForce 9300M G
GeForce 9200M GS
GeForce 9100M G
GeForce 8800M GTS
GeForce 8700M GT
GeForce 8600M GT
GeForce 8600M GS
GeForce 8400M GT
GeForce 8400M GS
Nvidia Tesla *
Tesla C2050/C2070
Tesla M2050/M2070/M2090
Tesla S2050
Tesla S1070
Tesla M1060
Tesla C1060
Tesla C870
Tesla D870
Tesla S870
Nvidia Quadro для настільних комп'ютерів
Quadro 6000
Quadro 5000
Quadro 4000
Quadro 2000
Quadro 600
Quadro FX 5800
Quadro FX 5600
Quadro FX 4800
Quadro FX 4700 X2
Quadro FX 4600
Quadro FX 3700
Quadro FX 1700
Quadro FX 570
Quadro FX 470
Quadro FX 380 Low Profile
Quadro FX 370
Quadro FX 370 Low Profile
Quadro CX
Quadro NVS 450
Quadro NVS 420
Quadro NVS 290
Quadro Plex 2100 D4
Quadro Plex 2200 D2
Quadro Plex 2100 S4
Quadro Plex 1000 Model IV
Nvidia Quadro для мобільних комп'ютерів
Quadro 5010M
Quadro 5000M
Quadro 4000M
Quadro 3000M
Quadro 2000M
Quadro 1000M
Quadro FX 3800M
Quadro FX 3700M
Quadro FX 3600M
Quadro FX 2800M
Quadro FX 2700M
Quadro FX 1800M
Quadro FX 1700M
Quadro FX 1600M
Quadro FX 880M
Quadro FX 770M
Quadro FX 570M
Quadro FX 380M
Quadro FX 370M
Quadro FX 360M
Quadro NVS 5100M
Quadro NVS 4200M
Quadro NVS 3100M
Quadro NVS 2100M
Quadro NVS 320M
Quadro NVS 160M
Quadro NVS 150M
Quadro NVS 140M
Quadro NVS 135M
Quadro NVS 130M
  • Моделі Tesla C1060, Tesla S1070, Tesla C2050/C2070, Tesla M2050/M2070, Tesla S2050 дозволяють робити обчислення на GPU з подвійною точністю.

6. Особливості та специфікації різних версій

Feature support (unlisted features are
supported for all compute capabilities)
Compute capability (version)
1.0 1.1 1.2 1.3 2.x
Integer atomic functions operating on
32-bit words in global memory
Немає Так
atomicExch () operating on 32-bit
floating point values ​​in global memory
Integer atomic functions operating on
32-bit words in shared memory
Немає Так
atomicExch () operating on 32-bit
floating point values ​​in shared memory
Integer atomic functions operating on
64-bit words in global memory
Warp vote functions
Double-precision floating-point operations Немає Так
Atomic functions operating on 64-bit
integer values ​​in shared memory
Немає Так
Floating-point atomic addition operating on
32-bit words in global and shared memory
_ballot ()
_threadfence_system ()
_syncthreads_count (),
_syncthreads_and (),
_syncthreads_or ()
Surface functions
3D grid of thread block
Technical specifications Compute capability (version)
1.0 1.1 1.2 1.3 2.x
Maximum dimensionality of grid of thread blocks 2 3
Maximum x-, y-, or z-dimension of a grid of thread blocks 65535
Maximum dimensionality of thread block 3
Maximum x-or y-dimension of a block 512 1024
Maximum z-dimension of a block 64
Maximum number of threads per block 512 1024
Warp size 32
Maximum number of resident blocks per multiprocessor 8
Maximum number of resident warps per multiprocessor 24 32 48
Maximum number of resident threads per multiprocessor 768 1024 1536
Number of 32-bit registers per multiprocessor 8 K 16 K 32 K
Maximum amount of shared memory per multiprocessor 16 KB 48 KB
Number of shared memory banks 16 32
Amount of local memory per thread 16 KB 512 KB
Constant memory size 64 KB
Cache working set per multiprocessor for constant memory 8 KB
Cache working set per multiprocessor for texture memory Device dependent, between 6 KB and 8 KB
Maximum width for 1D texture
reference bound to a CUDA array
8192 32768
Maximum width for 1D texture
reference bound to linear memory
27 лютого
Maximum width and number of layers
for a 1D layered texture reference
8192 x 512 16384 x 2048
Maximum width and height for 2D
texture reference bound to
linear memory or a CUDA array
65536 x 32768 65536 x 65535
Maximum width, height, and number
of layers for a 2D layered texture reference
8192 x 8192 x 512 16384 x 16384 x 2048
Maximum width, height and depth
for a 3D texture reference bound to linear
memory or a CUDA array
2048 x 2048 x 2048
Maximum number of textures that
can be bound to a kernel
128
Maximum width for a 1D surface
reference bound to a CUDA array
Not
supported
8192
Maximum width and height for a 2D
surface reference bound to a CUDA array
8192 x 8192
Maximum number of surfaces that
can be bound to a kernel
8
Maximum number of instructions per
kernel
2 million

7. Приклад

Цей приклад коду на C + + завантаження текстур з зображення в масив на GPU :

 cudaArray  *  cu_array  ;  texture  <  float  ,  2  >  tex  ;  / / Allocate array  cudaMalloc  (  &  cu_array  ,  cudaCreateChannelDesc  <  float  >  (  )  ,  width  ,  height  )  ;  / / Copy image data to array  cudaMemcpy  (  cu_array  ,  image  ,  width  *  height  ,  cudaMemcpyHostToDevice  )  ;  / / Bind the array to the texture  cudaBindTexture  (  tex  ,  cu_array  )  ;  / / Run kernel  dim3 blockDim  (  16  ,  16  ,  1  )  ;  dim3 gridDim  (  width  /  blockDim.  x  ,  height  /  blockDim.  y  ,  1  )  ;  kernel  <<<  gridDim  ,  blockDim  ,  0  >>>  (  d_odata  ,  width  ,  height  )  ;  cudaUnbindTexture  (  tex  )  ;  __global__  void  kernel  (  float  *  odata  ,  int  height  ,  int  width  )  {  unsigned  int  x  =  blockIdx.  x  *  blockDim.  x  +  threadIdx.  x  ;  unsigned  int  y  =  blockIdx.  y  *  blockDim.  y  +  threadIdx.  y  ;  float  c  =  texfetch  (  tex  ,  x  ,  y  )  ;  odata  [  y  *  width  +  x  ]  =  c  ;  } 

Приклад програми на мові Python, Перемножуючий елементи масиву засобами GPU. Взаємодія йде з використанням PyCUDA [6]

 import  pycuda.  driver  as  drv  import  numpy drv.  init  (  )  dev  =  drv.  Device  (  0  )  ctx  =  dev.  make_context  (  )  mod  =  drv.  SourceModule  (  "" "__ Global__ void multiply_them (float * dest, float * a, float * b) {const int i = threadIdx.x; dest [i] = a [i] * b [i];}" ""  )  multiply_them  =  mod.  get_function  (  "Multiply_them"  )  a  =  numpy.  random  .  randn  (  400  )  .  astype  (  numpy.  float32  )  b  =  numpy.  random  .  randn  (  400  )  .  astype  (  numpy.  float32  )  dest  =  numpy.  zeros_like  (  a  )  multiply_them  (  drv.  Out  (  dest  )  ,  drv.  In  (  a  )  ,  drv.  In  (  b  )  ,  block  =  (  400  ,  1  ,  1  )  )  print  dest-a * b 

8. CUDA як предмет у вузах

Станом на грудень 2009 року, програмна модель CUDA викладається в 269 університетах по всьому світу. У Росії навчальні курси по CUDA читаються в Санкт-Петербурзькому політехнічному університеті, Ярославському державному університеті ім.П. Г. Демидова, Московському, Нижегородському, Санкт-Петербурзькому, Тверському, Казанському, Новосибірськом, Новосибірському державному технічному університеті Омському і Пермському державних університетах, Міжнародному університеті природи суспільства і людини "Дубна", Об'єднаному інституті ядерних досліджень, Московському інституті електронної техніки, Іванівському державному енергетичному університеті, Білгородський державний університет, МГТУ ім.Баумана, Московському Авіаційному Інституті, РХТУ ім.Менделєєва, Російському науковому центрі "Курчатовський інститут", Міжрегіональному суперкомп'ютерному центрі РАН, Таганрозькій технологічному інституті (ТТІ ПФУ). [7] Крім того, в грудні 2009 року було оголошено про початок роботи першого в Росії науково-освітнього центру "Паралельні обчислення", розташованого в місті Дубна, в завдання якого входять навчання та консультації щодо вирішення складних обчислювальних завдань на GPU. [7]

На Україні курси по CUDA читаються в Київському інституті системного аналізу. [7]