CUDA ( аббревиатура от Compute Unified Device Architecture ) - это платформа параллельных вычислений и модель интерфейса прикладного программирования (API), созданная Nvidia . [1] Это позволяет разработчикам программного обеспечения и разработчики программного обеспечения , чтобы использовать CUDA с поддержкой графического процессора (GPU) для обработки общего назначения - подход называется GPGPU (вычисления общего назначения на графических процессоров). Платформа CUDA - это программный уровень, который предоставляет прямой доступ к виртуальному набору команд графического процессора и параллельным вычислительным элементам для выполнениявычислить ядра . [2]
Разработчики) | Nvidia |
---|---|
Первый выпуск | 23 июня 2007 г . |
Стабильный выпуск | 11.3.0 / 15 апреля 2021 г . |
Операционная система | Windows , Linux |
Платформа | Поддерживаемые графические процессоры |
Тип | ГПГПУ |
Лицензия | Проприетарный |
Веб-сайт | разработчик |
Платформа CUDA предназначена для работы с такими языками программирования, как C , C ++ и Fortran . Эта доступность упрощает специалистам по параллельному программированию использование ресурсов графического процессора в отличие от предыдущих API, таких как Direct3D и OpenGL , которые требовали передовых навыков программирования графики. [3] Графические процессоры на базе CUDA также поддерживают платформы программирования, такие как OpenMP , OpenACC и OpenCL ; [4] [2] и HIP путем компиляции такого кода в CUDA. Когда Nvidia впервые представила CUDA, это название было аббревиатурой Compute Unified Device Architecture [5], но впоследствии Nvidia отказалась от общего использования этой аббревиатуры.
Задний план
Графический процессор (GPU), как специализированный компьютерный процессор, удовлетворяет потребности в ресурсоемких задачах трехмерной графики в реальном времени с высоким разрешением . К 2012 году графические процессоры превратились в высокопараллельные многоядерные системы, позволяющие очень эффективно манипулировать большими блоками данных. Эта конструкция более эффективна, чем центральный процессор (ЦП) общего назначения для алгоритмов в ситуациях, когда обработка больших блоков данных выполняется параллельно, например:
- push-relabel алгоритм максимального потока
- алгоритмы быстрой сортировки больших списков
- двумерное быстрое вейвлет-преобразование
- моделирование молекулярной динамики
- машинное обучение
Возможности программирования
Платформа CUDA доступна разработчикам программного обеспечения через библиотеки с ускорением CUDA, директивы компилятора, такие как OpenACC , и расширения для стандартных языков программирования, включая C , C ++ и Fortran . Программисты C / C ++ могут использовать CUDA C / C ++, скомпилированный в PTX с помощью nvcc , компилятора Nvidia на основе LLVM C / C ++. [6] Программисты Fortran могут использовать «CUDA Fortran», скомпилированный с помощью компилятора PGI CUDA Fortran от Portland Group .
В дополнение к библиотекам, директивы компилятора, CUDA C / C ++ и CUDA Fortran, на опоры платформы CUDA другие вычислительные интерфейсы, включая Khronos Group «s OpenCL , [7] от Microsoft DirectCompute , OpenGL Compute Shader и C ++ AMP . [8] Сторонние оболочки также доступны для Python , Perl , Fortran , Java , Ruby , Lua , Common Lisp , Haskell , R , MATLAB , IDL , Julia и встроенной поддержки в Mathematica .
В индустрии компьютерных игр графические процессоры используются для рендеринга графики и расчетов физики игр (физических эффектов, таких как мусор, дым, огонь, жидкости); примеры включают PhysX и Bullet . CUDA также использовался для ускорения неграфических приложений в вычислительной биологии , криптографии и других областях на порядок или больше. [9] [10] [11] [12] [13]
CUDA предоставляет как API низкого уровня ( API драйвера CUDA , не из одного источника), так и API более высокого уровня ( API времени выполнения CUDA , из одного источника). Первоначальный CUDA SDK был обнародован 15 февраля 2007 года для Microsoft Windows и Linux . Поддержка Mac OS X была позже добавлена в версию 2.0, [14] которая заменяет бета-версию, выпущенную 14 февраля 2008 года. [15] CUDA работает со всеми графическими процессорами Nvidia от серии G8x и далее, включая GeForce , Quadro и линейку Tesla . CUDA совместим с большинством стандартных операционных систем.
CUDA 8.0 поставляется со следующими библиотеками (для компиляции и выполнения в алфавитном порядке):
- cuBLAS - библиотека подпрограмм базовой линейной алгебры CUDA
- CUDART - библиотека времени выполнения CUDA
- cuFFT - библиотека быстрого преобразования Фурье CUDA
- cuRAND - библиотека генерации случайных чисел CUDA
- cuSOLVER - набор плотных и разреженных прямых решателей на основе CUDA
- cuSPARSE - библиотека разреженных матриц CUDA
- NPP - библиотека NVIDIA Performance Primitives
- nvGRAPH - библиотека NVIDIA Graph Analytics
- NVML - Библиотека управления NVIDIA
- NVRTC - библиотека компиляции времени выполнения NVIDIA для CUDA C ++
CUDA 8.0 поставляется с этими другими программными компонентами:
- nView - Программное обеспечение NVIDIA nView для управления настольными ПК
- NVWMI - набор инструментов для управления предприятием NVIDIA
- GameWorks PhysX - многоплатформенный игровой физический движок.
CUDA 9.0–9.2 поставляется с другими компонентами:
- CUTLASS 1.0 - пользовательские алгоритмы линейной алгебры,
NVCUVID- NVIDIA Video Decoder устарел в CUDA 9.2; теперь он доступен в NVIDIA Video Codec SDK
CUDA 10 поставляется с другими компонентами:
- nvJPEG - гибридная (CPU и GPU) обработка JPEG
Cuda с 11 по 11.3 поставляется с другими компонентами: [16] [17] [18] [19]
- CUB - это новая из более поддерживаемых библиотек C ++.
- Поддержка нескольких экземпляров графического процессора MIG
Преимущества
CUDA имеет несколько преимуществ перед традиционными вычислениями общего назначения на графических процессорах (GPGPU) с использованием графических API:
- Разрозненное чтение - код может читать с произвольных адресов в памяти.
- Единая виртуальная память (CUDA 4.0 и выше)
- Единая память (CUDA 6.0 и выше)
- Общая память - CUDA предоставляет быструю область разделяемой памяти, которая может быть разделена между потоками. Его можно использовать как управляемый пользователем кеш, обеспечивая более высокую пропускную способность, чем это возможно при поиске текстур. [20]
- Более быстрая загрузка и обратное считывание в и из графического процессора
- Полная поддержка целочисленных и побитовых операций, включая поиск целочисленных текстур.
- На картах серий RTX 20 и 30 ядра CUDA используются для функции, называемой «RTX IO». Именно здесь ядра CUDA значительно сокращают время загрузки игры.
Ограничения
- Независимо от того, идет ли речь о главном компьютере или устройстве с графическим процессором, весь исходный код CUDA теперь обрабатывается в соответствии с правилами синтаксиса C ++. [21] Так было не всегда. Ранние версии CUDA основывались на правилах синтаксиса C. [22] Как и в более общем случае компиляции кода C с помощью компилятора C ++, поэтому возможно, что старый исходный код CUDA в стиле C либо не будет компилироваться, либо будет вести себя не так, как предполагалось изначально.
- Взаимодействие с языками визуализации, такими как OpenGL, является односторонним: OpenGL имеет доступ к зарегистрированной памяти CUDA, а CUDA не имеет доступа к памяти OpenGL.
- Копирование между хостом и памятью устройства может привести к снижению производительности из-за пропускной способности системной шины и задержек (это можно частично уменьшить с помощью асинхронной передачи памяти, обрабатываемой механизмом DMA графического процессора).
- Для лучшей производительности потоки должны выполняться группами по крайней мере по 32, а общее количество потоков исчисляется тысячами. Ветви в программном коде не оказывают существенного влияния на производительность при условии, что каждый из 32 потоков использует один и тот же путь выполнения; SIMD - модель выполнения становится существенным ограничением для любой задачи по своей сути расходящейся (например , пересекая пространство разбиение структуры данных в ходе трассировки лучей ).
- Для современных версий нет эмулятора или резервных функций.
- Допустимый C ++ иногда может быть помечен и предотвращать компиляцию из-за того, как компилятор подходит к оптимизации с учетом ограничений целевого устройства GPU. [ необходима цитата ]
- C ++ типа времени выполнения информации (RTTI) и C ++ - обработка исключений типа поддерживается только в коде хоста, а не в коде устройства.
- В устройствах с одинарной точностью на устройствах 1.x с вычислительной возможностью CUDA первого поколения денормальные числа не поддерживаются и вместо этого сбрасываются до нуля, а точность операций деления и извлечения квадратного корня немного ниже, чем точность вычислений с одинарной точностью, совместимая с IEEE 754. Устройства, поддерживающие вычислительные возможности 2.0 и выше, поддерживают денормальные числа, а операции деления и извлечения квадратного корня по умолчанию соответствуют стандарту IEEE 754. Однако при желании пользователи могут получить предыдущую более быструю математику игрового уровня вычислительных возможностей устройств 1.x, установив флаги компилятора, чтобы отключить точное деление и точные квадратные корни, а также включить сброс денормальных чисел в ноль. [23]
- В отличие от OpenCL , графические процессоры с поддержкой CUDA доступны только от Nvidia. [24] Попытки реализовать CUDA на других графических процессорах включают:
- Project Coriander: конвертирует исходный код CUDA C ++ 11 в OpenCL 1.2 C. Форк CUDA-on-CL, предназначенный для запуска TensorFlow . [25] [26] [27]
- CU2CL: преобразование CUDA 3.2 C ++ в OpenCL C. [28]
- GPUOpen HIP: тонкий слой абстракции поверх CUDA и ROCm, предназначенный для графических процессоров AMD и Nvidia. Имеет инструмент преобразования для импорта исходного кода CUDA C ++. Поддерживает CUDA 4.0 плюс C ++ 11 и float16.
Поддерживаемые графические процессоры
Поддерживаемый уровень CUDA графического процессора и карты. Смотрите также на Nvidia :
- CUDA SDK 1.0 поддерживает вычислительные возможности 1.0–1.1 (Tesla) [29]
- Поддержка CUDA SDK 1.1 для вычислительных возможностей 1.0 - 1.1 + x (Tesla)
- Поддержка CUDA SDK 2.0 для вычислительных возможностей 1.0 - 1.1 + x (Tesla)
- CUDA SDK 2.1–2.3.1 поддержка вычислительных возможностей 1.0–1.3 (Tesla) [30] [31] [32] [33]
- CUDA SDK 3.0 - 3.1 поддержка вычислительных возможностей 1.0 - 2.0 (Tesla, Fermi) [34] [35]
- Поддержка CUDA SDK 3.2 для вычислительных возможностей 1.0 - 2.1 (Tesla, Fermi) [36]
- CUDA SDK 4.0 - 4.2 поддержка вычислительных возможностей 1.0 - 2.1 + x (Tesla, Fermi, другие?).
- CUDA SDK 5.0 - 5.5 поддержка вычислительных возможностей 1.0 - 3.5 (Tesla, Fermi, Kepler).
- CUDA SDK 6.0 поддерживает вычислительные возможности 1.0 - 3.5 (Tesla, Fermi, Kepler).
- CUDA SDK 6.5 поддерживает вычислительные возможности 1.1 - 5.x (Тесла, Ферми, Кеплер, Максвелл). Последняя версия с поддержкой вычислительных возможностей 1.x (Tesla).
- CUDA SDK 7.0 - 7.5 поддержка вычислительных возможностей 2.0 - 5.x (Ферми, Кеплер, Максвелл).
- CUDA SDK 8.0 поддерживает вычислительные возможности 2.0 - 6.x (Ферми, Кеплер, Максвелл, Паскаль). Последняя версия с поддержкой вычислительных возможностей 2.x (Fermi) (Pascal GTX 1070Ti не поддерживается).
- CUDA SDK 9.0–9.2, поддержка вычислительных возможностей 3.0–7.2 (Kepler, Maxwell, Pascal, Volta) (Pascal GTX 1070Ti не поддерживается. CUDA SDK 9.0 и поддержка CUDA SDK 9.2).
- CUDA SDK 10.0 - 10.2 поддерживает вычислительные возможности 3.0 - 7.5 (Кеплер, Максвелл, Паскаль, Вольта, Тьюринг). Последняя версия с поддержкой вычислительных возможностей 3.x (Kepler). 10.2 - это последний официальный выпуск для macOS, так как поддержка для macOS в более новых выпусках не будет.
- CUDA SDK 11.0 поддерживает вычислительные возможности 3.5 - 8.0 (Kepler (частично), Maxwell, Pascal, Volta, Turing, Ampere (частично)). [37] Новые типы данных: Bfloat16 и TF32 на тензорных ядрах третьего поколения. [38]
- CUDA SDK 11.1 - 11.3 поддерживает вычислительные возможности 3.5 - 8.6 (Kepler (частично), Maxwell, Pascal, Volta, Turing, Ampere). [39]
Вычислительные возможности (версия) | Микро- архитектура | Графические процессоры | GeForce | Quadro, NVS | ГП Tesla / Datacenter | Тегра, Джетсон, ДРАЙВ |
---|---|---|---|---|---|---|
1.0 | Тесла | G80 | GeForce 8800 Ultra, GeForce 8800 GTX, GeForce 8800 GTS (G80) | Quadro FX 5600, Quadro FX 4600, Quadro Plex 2100 S4 | Тесла C870, Тесла D870, Тесла S870 | |
1.1 | G92, G94, G96, G98, G84, G86 | GeForce GTS 250, GeForce 9800 GX2, GeForce 9800 GTX, GeForce 9800 GT, GeForce 8800 GTS (G92), GeForce 8800 GT, GeForce 9600 GT, GeForce 9500 GT, GeForce 9400 GT, GeForce 8600 GTS, GeForce 8600 GT, GeForce 8500 GT , GeForce G110M, GeForce 9300M GS, GeForce 9200M GS, GeForce 9100M G, GeForce 8400M GT, GeForce G105M | Quadro FX 4700 X2, Quadro FX 3700, Quadro FX 1800, Quadro FX 1700, Quadro FX 580, Quadro FX 570, Quadro FX 470, Quadro FX 380, Quadro FX 370, Quadro FX 370 Low Profile, Quadro NVS 450, Quadro NVS 420 , Quadro NVS 290, Quadro NVS 295, Quadro Plex 2100 D4, Quadro FX 3800M, Quadro FX 3700M, Quadro FX 3600M, Quadro FX 2800M, Quadro FX 2700M, Quadro FX 1700M, Quadro FX 1600M, Quadro FX 770M, Quadro FX 570M, Quadro FX 370M, Quadro FX 360M, Quadro NVS 320M, Quadro NVS 160M, Quadro NVS 150M, Quadro NVS 140M, Quadro NVS 135M, Quadro NVS 130M, Quadro NVS 450, Quadro NVS 420, [40] Quadro NVS 295 | |||
1.2 | GT218, GT216, GT215 | GeForce GT 340 *, GeForce GT 330 *, GeForce GT 320 *, GeForce 315 *, GeForce 310 *, GeForce GT 240, GeForce GT 220, GeForce 210, GeForce GTS 360M, GeForce GTS 350M, GeForce GT 335M, GeForce GT 330M, GeForce GT 325M, GeForce GT 240M, GeForce G210M, GeForce 310M, GeForce 305M | Quadro FX 380 Low Profile, Quadro FX 1800M, Quadro FX 880M, Quadro FX 380M, Nvidia NVS 300, NVS 5100M, NVS 3100M, NVS 2100M, ION | |||
1.3 | GT200, GT200b | GeForce GTX 295, GTX 285, GTX 280, GeForce GTX 275, GeForce GTX 260 | Quadro FX 5800, Quadro FX 4800, Quadro FX 4800 для Mac, Quadro FX 3800, Quadro CX, Quadro Plex 2200 D2 | Тесла C1060, Тесла S1070, Тесла M1060 | ||
2.0 | Ферми | GF100, GF110 | GeForce GTX 590, GeForce GTX 580, GeForce GTX 570, GeForce GTX 480, GeForce GTX 470, GeForce GTX 465, GeForce GTX 480M | Quadro 6000, Quadro 5000, Quadro 4000, Quadro 4000 для Mac, Quadro Plex 7000, Quadro 5010M, Quadro 5000M | Тесла C2075, Тесла C2050 / C2070, Тесла M2050 / M2070 / M2075 / M2090 | |
2.1 | GF104, GF106 GF108, GF114, GF116, GF117, GF119 | GeForce GTX 560 Ti, GeForce GTX 550 Ti, GeForce GTX 460, GeForce GTS 450, GeForce GTS 450 *, GeForce GT 640 (GDDR3), GeForce GT 630, GeForce GT 620, GeForce GT 610, GeForce GT 520, GeForce GT 440, GeForce GT 440 *, GeForce GT 430, GeForce GT 430 *, GeForce GT 420 *, GeForce GTX 675M, GeForce GTX 670M, GeForce GT 635M, GeForce GT 630M, GeForce GT 625M, GeForce GT 720M, GeForce GT 620M, GeForce 710M, GeForce 610M, GeForce 820M, GeForce GTX 580M, GeForce GTX 570M, GeForce GTX 560M, GeForce GT 555M, GeForce GT 550M, GeForce GT 540M, GeForce GT 525M, GeForce GT 520MX, GeForce GT 520M, GeForce GTX 485M, GeForce GTX 470M, GeForce GTX 460M, GeForce GT 445M, GeForce GT 435M, GeForce GT 420M, GeForce GT 415M, GeForce 710M, GeForce 410M | Quadro 2000, Quadro 2000D, Quadro 600, Quadro 4000M, Quadro 3000M, Quadro 2000M, Quadro 1000M, NVS 310, NVS 315, NVS 5400M, NVS 5200M, NVS 4200M | |||
3.0 | Кеплер | ГК104, ГК106, ГК107 | GeForce GTX 770, GeForce GTX 760, GeForce GT 740, GeForce GTX 690, GeForce GTX 680, GeForce GTX 670, GeForce GTX 660 Ti, GeForce GTX 660, GeForce GTX 650 Ti BOOST, GeForce GTX 650 Ti, GeForce GTX 650, GeForce GTX 880M, GeForce GTX 870M, GeForce GTX 780M, GeForce GTX 770M, GeForce GTX 765M, GeForce GTX 760M, GeForce GTX 680MX, GeForce GTX 680M, GeForce GTX 675MX, GeForce GTX 670MX, GeForce GTX 660M, GeForce GT 750M, GeForce GT 650M, GeForce GT 745M, GeForce GT 645M, GeForce GT 740M, GeForce GT 730M, GeForce GT 640M, GeForce GT 640M LE, GeForce GT 735M, GeForce GT 730M | Quadro K5000, Quadro K4200, Quadro K4000, Quadro K2000, Quadro K2000D, Quadro K600, Quadro K420, Quadro K500M, Quadro K510M, Quadro K610M, Quadro K1000M, Quadro K2000M, Quadro K1100M, Quadro K2100M, Quadro K30004M, Quadro K30004M, Quadro K30004M , Quadro K5000M, Quadro K4100M, Quadro K5100M, NVS 510, Quadro 410 | Tesla K10, GRID K340, GRID K520, GRID K2 | |
3,2 | GK20A | Тегра К1, Джетсон ТК1 | ||||
3.5 | GK110, GK208 | GeForce GTX Titan Z, GeForce GTX Titan Black, GeForce GTX Titan, GeForce GTX 780 Ti, GeForce GTX 780, GeForce GT 640 (GDDR5), GeForce GT 630 v2, GeForce GT 730, GeForce GT 720, GeForce GT 710, GeForce GT 740M (64-бит, DDR3), GeForce GT 920M | Quadro K6000, Quadro K5200 | Тесла К40, Тесла К20х, Тесла К20 | ||
3,7 | GK210 | Тесла К80 | ||||
5.0 | Максвелл | GM107, GM108 | GeForce GTX 750 Ti, GeForce GTX 750, GeForce GTX 960M, GeForce GTX 950M, GeForce 940M, GeForce 930M, GeForce GTX 860M, GeForce GTX 850M, GeForce 845M, GeForce 840M, GeForce 830M | Quadro K1200, Quadro K2200, Quadro K620, Quadro M2000M, Quadro M1000M, Quadro M600M, Quadro K620M, NVS 810 | Тесла М10 | |
5.2 | GM200, GM204, GM206 | GeForce GTX Titan X, GeForce GTX 980 Ti, GeForce GTX 980, GeForce GTX 970, GeForce GTX 960, GeForce GTX 950, GeForce GTX 750 SE, GeForce GTX 980M, GeForce GTX 970M, GeForce GTX 965M | Quadro M6000 24 ГБ, Quadro M6000, Quadro M5000, Quadro M4000, Quadro M2000, Quadro M5500, Quadro M5000M, Quadro M4000M, Quadro M3000M | Тесла М4, Тесла М40, Тесла М6, Тесла М60 | ||
5,3 | GM20B | Tegra X1, Jetson TX1, Jetson Nano, DRIVE CX, DRIVE PX | ||||
6.0 | Паскаль | GP100 | Quadro GP100 | Тесла P100 | ||
6.1 | GP102, GP104, GP106, GP107, GP108 | Nvidia TITAN Xp, Titan X, GeForce GTX 1080 Ti, GTX 1080, GTX 1070 Ti, GTX 1070, GTX 1060, GTX 1050 Ti, GTX 1050, GT 1030, GT 1010, MX350, MX330, MX250, MX230, MX150, MX130, MX110 | Quadro P6000, Quadro P5000, Quadro P4000, Quadro P2200, Quadro P2000, Quadro P1000, Quadro P400, Quadro P500, Quadro P520, Quadro P600, Quadro P5000 (мобильный), Quadro P4000 (мобильный), Quadro P3000 (мобильный) | Тесла P40, Тесла P6, Тесла P4 | ||
6.2 | GP10B [41] | Tegra X2, Jetson TX2, DRIVE PX 2 | ||||
7.0 | Вольта | GV100 | NVIDIA ТИТАН V | Quadro GV100 | Тесла V100, Тесла V100S | |
7.2 | GV10B [42] | Tegra Xavier, Jetson Xavier NX, Jetson AGX Xavier, DRIVE AGX Xavier, DRIVE AGX Pegasus | ||||
7,5 | Тьюринг | ТУ102, ТУ104, ТУ106, ТУ116, ТУ117 | NVIDIA TITAN RTX, GeForce RTX 2080 Ti, RTX 2080 Super, RTX 2080, RTX 2070 Super, RTX 2070, RTX 2060 Super, RTX 2060, GeForce GTX 1660 Ti, GTX 1660 Super, GTX 1660, GTX 1650 Super, GTX 1650, MX450 | Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Quadro RTX 4000, T1000, T600, T400 T1200 (мобильный), T600 (мобильный), T500 (мобильный), Quadro T2000 (мобильный), Quadro T1000 (мобильный) | Тесла Т4 | |
8.0 | Ампер | GA100 | A100 80 ГБ, A100 40 ГБ, A30 | |||
8,6 | GA102, GA104, GA106, GA107 | GeForce RTX 3090, RTX 3080 Ti, RTX 3080, RTX 3070, RTX 3060 Ti, RTX 3060, RTX 3050 Ti, RTX 3050 | RTX A6000, RTX A5000, RTX A4000 RTX A5000 (мобильный), RTX A4000 (мобильный), RTX A3000 (мобильный), RTX A2000 (мобильный) | A40, A16, A10, A4 | ||
9.0 | Бункер | подлежит уточнению | ||||
? | Ловелас | подлежит уточнению | подлежит уточнению | подлежит уточнению |
'*' - только OEM- продукты
Особенности и характеристики версии
Поддержка функций (функции, не указанные в списке, поддерживаются для всех вычислительных возможностей) | Вычислительные возможности (версия) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.x | 3.0 | 3,2 | 3,5, 3,7, 5,0, 5,2 | 5,3 | 6.x | 7.x | 8.0 | 8,6 | ||
Целочисленные атомарные функции, работающие с 32-битными словами в глобальной памяти | Нет | да | ||||||||||||
atomicExch (), работающий с 32-битными значениями с плавающей запятой в глобальной памяти | ||||||||||||||
Целочисленные атомарные функции, работающие с 32-битными словами в общей памяти | Нет | да | ||||||||||||
atomicExch (), работающий с 32-битными значениями с плавающей запятой в общей памяти | ||||||||||||||
Целочисленные атомарные функции, работающие с 64-битными словами в глобальной памяти | ||||||||||||||
Функции варп-голосования | ||||||||||||||
Операции с плавающей запятой двойной точности | Нет | да | ||||||||||||
Атомарные функции, работающие с 64-битными целыми числами в общей памяти | Нет | да | ||||||||||||
Атомарное сложение с плавающей запятой, работающее с 32-битными словами в глобальной и разделяемой памяти | ||||||||||||||
_ballot () | ||||||||||||||
_threadfence_system () | ||||||||||||||
_syncthreads_count (), _syncthreads_and (), _syncthreads_or () | ||||||||||||||
Поверхностные функции | ||||||||||||||
3D сетка блока резьбы | ||||||||||||||
Функции перетасовки деформации, унифицированная память | Нет | да | ||||||||||||
Сдвиг воронки | Нет | да | ||||||||||||
Динамический параллелизм | Нет | да | ||||||||||||
Операции с плавающей запятой половинной точности: сложение, вычитание, умножение, сравнение, функции перемешивания деформации, преобразование | Нет | да | ||||||||||||
Атомарное сложение, работающее с 64-битными значениями с плавающей запятой в глобальной памяти и общей памяти | Нет | да | ||||||||||||
Тензорное ядро | Нет | да | ||||||||||||
Функции матрицы деформации смешанной точности | Нет | да | ||||||||||||
Асинхронное копирование с аппаратным ускорением | Нет | да | ||||||||||||
Аппаратное ускорение разделенного барьера прибытия / ожидания | Нет | да | ||||||||||||
Управление резидентностью кэша L2 | Нет | да |
[43]
Тип данных | Операция | Поддерживается с | Поддерживается с тех пор для глобальной памяти | Поддерживается с тех пор для общей памяти |
---|---|---|---|---|
16-битное целое число | общие операции | |||
32-битное целое число | атомарные функции | 1.1 | 1.2 | |
64-битное целое число | атомарные функции | 1.2 | 2.0 | |
16-битная с плавающей запятой | сложение, вычитание, умножение, сравнение, функции перемешивания деформации, преобразование | 5,3 | ||
32-битная с плавающей запятой | atomicExch () | 1.1 | 1.2 | |
32-битная с плавающей запятой | атомное добавление | 2.0 | 2.0 | |
64-битная с плавающей запятой | общие операции | 1.3 | ||
64-битная с плавающей запятой | атомное добавление | 6.0 | 6.0 | |
тензорное ядро | 7.0 |
Примечание. Любые отсутствующие строки или пустые записи отражают некоторую нехватку информации об этом конкретном элементе.
[44]
Технические характеристики | Вычислительные возможности (версия) | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.x | 3.0 | 3,2 | 3.5 | 3,7 | 5.0 | 5.2 | 5,3 | 6.0 | 6.1 | 6.2 | 7.0 | 7.2 | 7,5 | 8.0 | 8,6 | |
Максимальное количество резидентных гридов на устройство (одновременное выполнение ядра) | подлежит уточнению | 16 | 4 | 32 | 16 | 128 | 32 | 16 | 128 | 16 | 128 | |||||||||
Максимальная размерность сетки резьбовых блоков | 2 | 3 | ||||||||||||||||||
Максимальный x-размер сетки резьбовых блоков | 65535 | 2 31 - 1 | ||||||||||||||||||
Максимальный y- или z-размер сетки резьбовых блоков | 65535 | |||||||||||||||||||
Максимальный размер резьбового блока | 3 | |||||||||||||||||||
Максимальный x- или y-размер блока | 512 | 1024 | ||||||||||||||||||
Максимальный z-размер блока | 64 | |||||||||||||||||||
Максимальное количество потоков на блок | 512 | 1024 | ||||||||||||||||||
Размер основы | 32 | |||||||||||||||||||
Максимальное количество резидентных блоков на мультипроцессор | 8 | 16 | 32 | 16 | 32 | 16 | ||||||||||||||
Максимальное количество резидентных варпов на мультипроцессор | 24 | 32 | 48 | 64 | 32 | 64 | 48 | |||||||||||||
Максимальное количество резидентных потоков на мультипроцессор | 768 | 1024 | 1536 | 2048 | 1024 | 2048 | 1536 | |||||||||||||
Количество 32-битных регистров на мультипроцессор | 8 К | 16 К | 32 К | 64 К | 128 К | 64 К | ||||||||||||||
Максимальное количество 32-битных регистров на блок потока | N / A | 32 К | 64 К | 32 К | 64 К | 32 К | 64 К | 32 К | 64 К | |||||||||||
Максимальное количество 32-битных регистров на поток | 124 | 63 | 255 | |||||||||||||||||
Максимальный объем разделяемой памяти на мультипроцессор | 16 КБ | 48 КБ | 112 КБ | 64 КБ | 96 КБ | 64 КБ | 96 КБ | 64 КБ | 96 КБ (из 128) | 64 КБ (из 96) | 164 КБ (из 192) | 100 КБ (из 128) | ||||||||
Максимальный объем разделяемой памяти на блок потока | 48 КБ | 96 КБ | 48 КБ | 64 КБ | 163 КБ | 99 КБ | ||||||||||||||
Количество общих банков памяти | 16 | 32 | ||||||||||||||||||
Количество локальной памяти на поток | 16 КБ | 512 КБ | ||||||||||||||||||
Постоянный размер памяти | 64 КБ | |||||||||||||||||||
Рабочий набор кэша для каждого мультипроцессора для постоянной памяти | 8 КБ | 4 КБ | 8 КБ | |||||||||||||||||
Рабочий набор кэша на мультипроцессор для текстурной памяти | 6-8 КБ | 12 КБ | 12 - 48 КБ | 24 КБ | 48 КБ | N / A | 24 КБ | 48 КБ | 24 КБ | 32 - 128 КБ | 32 - 64 КБ | 28 - 192 КБ | 28 - 128 КБ | |||||||
Максимальная ширина ссылки на 1D текстуру, привязанную к массиву CUDA | 8192 | 65536 | 131072 | |||||||||||||||||
Максимальная ширина ссылки на 1D текстуру, привязанную к линейной памяти | 2 27 | 2 28 | 2 27 | 2 28 | 2 27 | 2 28 | ||||||||||||||
Максимальная ширина и количество слоев для ссылки на одномерную многослойную текстуру | 8192 × 512 | 16384 × 2048 | 32768 х 2048 | |||||||||||||||||
Максимальная ширина и высота для ссылки на 2D-текстуру, привязанную к массиву CUDA | 65536 × 32768 | 65536 × 65535 | 131072 х 65536 | |||||||||||||||||
Максимальная ширина и высота для ссылки на 2D-текстуру, привязанную к линейной памяти | 65000 х 65000 | 65536 х 65536 | 131072 х 65000 | |||||||||||||||||
Максимальная ширина и высота для ссылки на 2D-текстуру, привязанную к массиву CUDA, поддерживающему сбор текстур | N / A | 16384 х 16384 | 32768 х 32768 | |||||||||||||||||
Максимальная ширина, высота и количество слоев для ссылки на двухмерную многослойную текстуру | 8192 × 8192 × 512 | 16384 × 16384 × 2048 | 32768 х 32768 х 2048 | |||||||||||||||||
Максимальная ширина, высота и глубина для ссылки на 3D-текстуру, привязанную к линейной памяти или массиву CUDA | 2048 3 | 4096 3 | 16384 3 | |||||||||||||||||
Максимальная ширина (и высота) ссылки на текстуру кубической карты | N / A | 16384 | 32768 | |||||||||||||||||
Максимальная ширина (и высота) и количество слоев для ссылки на многослойную текстуру кубической карты | N / A | 16384 × 2046 | 32768 × 2046 | |||||||||||||||||
Максимальное количество текстур, которые можно привязать к ядру | 128 | 256 | ||||||||||||||||||
Максимальная ширина для ссылки на одномерную поверхность, привязанную к массиву CUDA | Не поддерживается | 65536 | 16384 | 32768 | ||||||||||||||||
Максимальная ширина и количество слоев для одномерной многослойной привязки поверхности | 65536 × 2048 | 16384 × 2048 | 32768 × 2048 | |||||||||||||||||
Максимальная ширина и высота для двумерной привязки поверхности, привязанной к массиву CUDA | 65536 × 32768 | 16384 × 65536 | 131072 × 65536 | |||||||||||||||||
Максимальная ширина, высота и количество слоев для привязки 2D- слоистой поверхности | 65536 × 32768 × 2048 | 16384 × 16384 × 2048 | 32768 × 32768 × 2048 | |||||||||||||||||
Максимальная ширина, высота и глубина для трехмерной поверхности, привязанной к массиву CUDA. | 65536 × 32768 × 2048 | 4096 × 4096 × 4096 | 16384 × 16384 × 16384 | |||||||||||||||||
Максимальная ширина (и высота) ссылки на поверхность кубической карты, привязанной к массиву CUDA | 32768 | 16384 | 32768 | |||||||||||||||||
Максимальная ширина и количество слоев для привязки многослойной поверхности кубической карты | 32768 × 2046 | 16384 × 2046 | 32768 × 2046 | |||||||||||||||||
Максимальное количество поверхностей, которые можно связать с ядром | 8 | 16 | 32 | |||||||||||||||||
Максимальное количество инструкций на ядро | 2 миллиона | 512 миллионов |
[45]
Спецификации архитектуры | Вычислительные возможности (версия) | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.0 | 2.1 | 3.0 | 3.5 | 3,7 | 5.0 | 5.2 | 6.0 | 6.1, 6.2 | 7.0, 7.2 | 7,5 | 8.0 | 8,6 | |
Количество дорожек ALU для целочисленных арифметических операций с плавающей запятой и одинарной точности | 8 [46] | 32 | 48 | 192 | 128 | 64 | 128 | 64 | |||||||||
Количество специальных функциональных блоков для трансцендентных функций с плавающей запятой одинарной точности | 2 | 4 | 8 | 32 | 16 | 32 | 16 | ||||||||||
Количество блоков фильтрации текстур для каждого блока адресации текстуры или блока вывода рендеринга (ROP) | 2 | 4 | 8 | 16 | 8 [47] | ||||||||||||
Количество планировщиков деформации | 1 | 2 | 4 | 2 | 4 | ||||||||||||
Максимальное количество инструкций, выдаваемых одновременно одним планировщиком | 1 | 2 [48] | 1 | ||||||||||||||
Количество тензорных ядер | N / A | 8 [47] | 4 | ||||||||||||||
Размер в КБ объединенной памяти для кэша данных и общей памяти на несколько процессоров | подлежит уточнению | 128 | 96 [49] | 192 | 128 |
[50]
Для получения дополнительной информации см. Статью «Сравнительная таблица вычислительных возможностей NVIDIA CUDA».и прочтите руководство по программированию Nvidia CUDA. [51]
Пример
Этот пример кода на C ++ загружает текстуру из изображения в массив на графическом процессоре:
текстура < float , 2 , cudaReadModeElementType > tex ;void foo () { cudaArray * cu_array ; // Выделить массив cudaChannelFormatDesc description = cudaCreateChannelDesc < float > (); cudaMallocArray ( & cu_array , & описание , ширина , высота ); // Копируем данные изображения в массив cudaMemcpyToArray ( cu_array , image , width * height * sizeof ( float ), cudaMemcpyHostToDevice ); // Устанавливаем параметры текстуры (по умолчанию) tex . addressMode [ 0 ] = cudaAddressModeClamp ; текс . addressMode [ 1 ] = cudaAddressModeClamp ; текс . filterMode = cudaFilterModePoint ; текс . нормализованный = ложный ; // не нормализовать координаты // Привязываем массив к текстуре cudaBindTextureToArray ( tex , cu_array ); // Запускаем ядро dim3 blockDim ( 16 , 16 , 1 ); dim3 gridDim (( ширина + blockDim . x - 1 ) / blockDim . x , ( height + blockDim . y - 1 ) / blockDim . y , 1 ); ядро <<< gridDim , blockDim , 0 >>> ( d_data , height , width ); // Отключаем массив от текстуры cudaUnbindTexture ( tex ); } // конец foo ()__global__ void kernel ( float * odata , int height , int width ) { unsigned int x = blockIdx . x * blockDim . x + threadIdx . х ; беззнаковый int y = blockIdx . y * blockDim . y + threadIdx . у ; если ( х < ширина && у < высота ) { float c = tex2D ( текс , х , у ); odata [ y * ширина + x ] = c ; } }
Ниже приведен пример на Python, который вычисляет произведение двух массивов на графическом процессоре. Неофициальные привязки к языку Python можно получить из PyCUDA . [52]
импортировать pycuda.compiler как comp import pycuda.driver as drv import numpy import pycuda.autoinitмод = комп . SourceModule ( "" " __global__ void multiply_them (float * dest, float * a, float * b) { const int i = threadIdx.x; dest [i] = a [i] * b [i]; } " "" )multiply_them = мод . get_function ( "multiply_them" )а = numpy . случайный . рандн ( 400 ) . astype ( NumPy . float32 ) б = NumPy . случайный . рандн ( 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 )
Дополнительные привязки Python для упрощения операций умножения матриц можно найти в программе pycublas . [53]
импортировать numpy из pycublas import CUBLASMatrix = CUBLASMatrix ( NumPy . Мат ([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]], NumPy . Float32 )) В = CUBLASMatrix ( NumPy . Мат ([[ 2 , 3 ], [ 4 , 5 ], [ 6 , 7 ]], NumPy . float32 )) С = * В печати ( С . np_mat ())
в то время как CuPy напрямую заменяет NumPy: [54]
импортный кубока = купи . случайный . randn ( 400 ) b = купи . случайный . рандн ( 400 )dest = купи . zeros_like ( а )print ( dest - a * b )
Текущее и будущее использование архитектуры CUDA
- Ускоренный рендеринг 3D-графики
- Ускоренное взаимное преобразование форматов видеофайлов
- Ускоренное шифрование , дешифрование и сжатие
- Биоинформатика , например, секвенирование ДНК NGS BarraCUDA [55]
- Распределенные вычисления, такие как предсказание нативной конформации белков.
- Медицинские моделирования анализа, например виртуальной реальности , основанные на КТ и МРТ сканирования изображений
- Физическое моделирование, [56] в частности, в гидродинамике
- Обучение нейронной сети в задачах машинного обучения
- Распознавание лица
- Распределенных вычислений
- Молекулярная динамика
- Майнинг криптовалют
- BOINC SETI @ home
- Программное обеспечение структуры из движения (SfM)
Смотрите также
- OpenCL - открытый стандарт от Khronos Group для программирования различных платформ, включая графические процессоры, аналогичный API-интерфейсу драйвера CUDA нижнего уровня ( не из одного источника )
- SYCL - открытый стандарт от Khronos Group для программирования различных платформ, включая графические процессоры, с использованием современного C ++ с одним исходным кодом , аналогичный высокоуровневому CUDA Runtime API (с одним исходным кодом )
- BrookGPU - компилятор графической группы Стэнфордского университета
- БЕДРО
- Программирование массива
- Параллельные вычисления
- Потоковая обработка
- rCUDA - API для вычислений на удаленных компьютерах
- Молекулярное моделирование на графическом процессоре
- Vulkan - низкоуровневый высокопроизводительный API для 3D-графики и вычислений
- OptiX - API трассировки лучей от NVIDIA
Рекомендации
- ^ «Домашняя страница Nvidia CUDA» .
- ^ а б Аби-Чахла, Феди (18 июня 2008 г.). «CUDA от Nvidia: конец процессора?» . Оборудование Тома . Проверено 17 мая 2015 года .
- ^ Цунитч, Питер (2018-01-24). «CUDA против OpenCL против OpenGL» . Видеомейкер . Проверено 16 сентября 2018 .
- ^ «OpenCL» . Разработчик NVIDIA . 2013-04-24 . Проверено 4 ноября 2019 .
- ^ Шимпи, Ананд Лал; Уилсон, Дерек (8 ноября 2006 г.). «Nvidia's GeForce 8800 (G80): графические процессоры, переработанные для DirectX 10» . AnandTech . Проверено 16 мая 2015 года .
- ^ "Компилятор CUDA LLVM" .
- ^ Первая демонстрация OpenCL на графическом процессоре на YouTube
- ^ Демонстрация DirectCompute Ocean, работающая на графическом процессоре Nvidia с поддержкой CUDA, на YouTube
- ^ Василиадис, Гиоргос; Антонатос, Спирос; Полихронакис, Михалис; Markatos, Evangelos P .; Иоаннидис, Сотирис (сентябрь 2008 г.). «Gnort: высокопроизводительное обнаружение сетевых вторжений с использованием графических процессоров» (PDF) . Материалы 11-го Международного симпозиума по последним достижениям в обнаружении вторжений (RAID) .
- ^ Schatz, Майкл С .; Трапнелл, Коул; Делчер, Артур Л .; Варшней, Амитабх (2007). «Выравнивание последовательностей с высокой пропускной способностью с использованием графических процессоров» . BMC Bioinformatics . 8 : 474. DOI : 10,1186 / 1471-2105-8-474 . PMC 2222658 . PMID 18070356 .
- ^ «Пирит - код Google» .
- ^ «Используйте свой графический процессор Nvidia для научных вычислений» . BOINC. 2008-12-18. Архивировано из оригинала на 2008-12-28 . Проверено 8 августа 2017 .
- ^ «Комплект разработчика программного обеспечения Nvidia CUDA (CUDA SDK) - Примечания к выпуску версии 2.0 для MAC OS X» . Архивировано из оригинала на 2009-01-06.
- ^ «CUDA 1.1 - теперь в Mac OS X» . 14 февраля 2008. Архивировано из оригинального 22 ноября 2008 года.
- ^ https://developer.nvidia.com/blog/cuda-11-features-revealed/
- ^ https://developer.nvidia.com/blog/cuda-11-1-introduces-support-rtx-30-series/
- ^ https://developer.nvidia.com/blog/enhancing-memory-allocation-with-new-cuda-11-2-features/
- ^ https://developer.nvidia.com/blog/exploring-the-new-features-of-cuda-11-3/
- ^ Зильберштейн, Марк; Шустер, Ассаф ; Гейгер, Дэн; Патни, Анджул; Оуэнс, Джон Д. (2008). Эффективное вычисление сумм-произведений на графических процессорах с помощью программно-управляемого кеша (PDF) . Материалы 22-й ежегодной международной конференции по суперкомпьютерам - ICS '08. С. 309–318. DOI : 10.1145 / 1375527.1375572 . ISBN 978-1-60558-158-3.
- ^ «Руководство по программированию на CUDA C версии 8.0» (PDF) . Зона разработчиков nVidia . Раздел 3.1.5. Январь 2017. с. 19 . Проверено 22 марта 2017 года .CS1 maint: location ( ссылка )
- ^ «NVCC заставляет C ++ компилировать файлы .cu» .
- ^ Уайтхед, Натан; Фит-Флореа, Алекс. «Точность и производительность: соответствие с плавающей запятой и IEEE 754 для графических процессоров Nvidia» (PDF) . Nvidia . Проверено 18 ноября 2014 года .
- ^ «Продукты с поддержкой CUDA» . Зона CUDA . Корпорация Nvidia . Проверено 3 ноября 2008 .
- ^ «Проект Coriander: компилируйте коды CUDA в OpenCL, запускайте везде» . Фороникс.
- ^ Перкинс, Хью (2017). "cuda-on-cl" (PDF) . IWOCL . Проверено 8 августа 2017 года .
- ^ "hughperkins / coriander: Создайте код NVIDIA® CUDA ™ для устройств OpenCL ™ 1.2" . GitHub. 6 мая 2019.
- ^ «Документация CU2CL» . chrec.cs.vt.edu .
- ^ «Руководство по программированию NVIDIA CUDA. Версия 1.0» (PDF) . 23 июня 2007 г.
- ^ «Руководство по программированию NVIDIA CUDA. Версия 2.1» (PDF) . 8 декабря 2008 г.
- ^ «Руководство по программированию NVIDIA CUDA. Версия 2.2» (PDF) . 2 апреля 2009 г.
- ^ «Руководство по программированию NVIDIA CUDA. Версия 2.2.1» (PDF) . 26 мая 2009 г.
- ^ «Руководство по программированию NVIDIA CUDA. Версия 2.3.1» (PDF) . 26 августа 2009 г.
- ^ «Руководство по программированию NVIDIA CUDA. Версия 3.0» (PDF) . 20 февраля 2010 г.
- ^ «Руководство по программированию NVIDIA CUDA C. Версия 3.1.1» (PDF) . 21 июля 2010 г.
- ^ «Руководство по программированию NVIDIA CUDA C. Версия 3.2» (PDF) . 9 ноября 2010 г.
- ^ «Примечания к выпуску CUDA 11.0» . Разработчик NVIDIA .
- ^ «Возможности CUDA 11 раскрыты» . Блог разработчиков NVIDIA . 2020-05-14 . Проверено 5 октября 2020 .
- ^ «Примечания к выпуску CUDA 11.1» . Разработчик NVIDIA .
- ^ «Технические характеристики NVIDIA Quadro NVS 420» . База данных GPU TechPowerUp .
- ^ Ларабель, Майкл (29 марта 2017 г.). «NVIDIA внедряет поддержку графических процессоров Tegra X2 в стиле модерн» . Фороникс . Проверено 8 августа 2017 года .
- ^ Спецификации Nvidia Xavier на TechPowerUp (предварительные)
- ^ «H.1. Функции и технические характеристики - Таблица 13. Поддержка функций в зависимости от вычислительных возможностей» . docs.nvidia.com . Проверено 23 сентября 2020 .
- ^ https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications
- ^ H.1. Функции и технические характеристики - Таблица 14. Технические характеристики по вычислительным возможностям
- ^ ALU выполняют только арифметику с плавающей запятой одинарной точности. Имеется 1 блок с плавающей запятой двойной точности.
- ^ а б Дюрант, Люк; Жиру, Оливье; Харрис, Марк; Стам, Ник (10 мая 2017 г.). «Внутри Volta: самый продвинутый в мире графический процессор для центров обработки данных» . Блог разработчиков Nvidia .
- ^ Не более одного планировщика могут выдавать 2 инструкции одновременно. Первый планировщик отвечает за деформации с нечетными идентификаторами. Второй планировщик отвечает за деформации с четными идентификаторами.
- ^ «H.6.1. Архитектура» . docs.nvidia.com . Проверено 13 мая 2019 .
- ^ «I.7. Вычислительные возможности 8.x» . docs.nvidia.com . Проверено 23 сентября 2020 .
- ^ «Приложение F. Характеристики и технические характеристики» (PDF) . (3,2 МБ) , страница 148 из 175 (версия 5.0, октябрь 2012 г.).
- ^ «PyCUDA» .
- ^ "пикублас" . Архивировано из оригинала на 2009-04-20 . Проверено 8 августа 2017 .
- ^ «CuPy» . Проверено 8 января 2020 .
- ^ «Биоинформатика nVidia CUDA: BarraCUDA» . BioCentric . 2019-07-19 . Проверено 15 октября 2019 .
- ^ «Часть V: Физическое моделирование» . Разработчик NVIDIA . Проверено 11 сентября 2020 .
Внешние ссылки
- Официальный веб-сайт