CUDA (изначально аббр. от англ. Compute Unified Device Architecture) — программно-аппаратная архитектура параллельных вычислений, которая позволяет существенно увеличить вычислительную производительность благодаря использованию графических процессоров фирмы Nvidia.
CUDA SDK позволяет программистам реализовывать на специальных упрощённых диалектах языков программирования Си, C++ и Фортран алгоритмы, выполнимые на графических и тензорных процессорах Nvidia[2]. Архитектура CUDA даёт разработчику возможность по своему усмотрению организовывать доступ к набору инструкций графического или тензорного ускорителя и управлять его памятью. Функции, ускоренные при помощи CUDA, можно вызывать из различных языков, в том числе Python[3], MATLAB[4] и т. п.
Программная архитектура
CUDA — кроссплатформенное программное обеспечение с поддержкой операционных системLinux, Mac OS X и Windows. Первоначальная версия CUDA SDK была представлена 15 февраля2007 года. В основе интерфейса программирования приложений CUDA лежит язык Си с некоторыми расширениями. Для успешной трансляции кода на этом языке в состав CUDA SDK входит собственный Си-компилятор командной строки nvcc компании Nvidia. Компилятор nvcc создан на основе открытого компилятора Open64 и предназначен для трансляции host-кода (главного, управляющего кода) и device-кода (аппаратного кода) (файлов с расширением .cu) в объектные файлы, пригодные в процессе сборки конечной программы или библиотеки в любой среде программирования.
В архитектуре CUDA используется модель памяти грид, кластерное моделированиепотоков и SIMD-инструкции. CUDA применима не только для высокопроизводительных графических вычислений, но и для научных вычислений с использованием видеокарт Nvidia. Учёные и исследователи используют CUDA таких областях, как астрофизика, вычислительная биология и химия, моделирование динамики жидкостей, электромагнитные взаимодействия, компьютерная томография, сейсмический анализ и др.
В CUDA имеется возможность подключения к приложениям, использующим OpenGL и Direct3D. 22 марта 2010 года Nvidia выпустила CUDA Toolkit 3.0 с поддержкой OpenCL[5].
Оборудование
Платформа CUDA впервые появились на рынке с выходом чипа NVIDIA восьмого поколения G80 и стала присутствовать во всех последующих сериях графических чипов, которые используются в семействах ускорителей GeForce, Quadro и NVidia Tesla.
Первая серия оборудования, поддерживающая CUDA SDK, G8x, имела 32-битный векторный процессородинарной точности, использующий CUDA SDK как API (CUDA поддерживает тип double языка Си, однако сейчас его точность понижена до 32-битного с плавающей запятой). Более поздние процессоры GT200 имеют поддержку 64-битной точности (только для SFU), но производительность значительно хуже, чем для 32-битной точности (из-за того, что SFU всего два на каждый потоковый мультипроцессор, а скалярных процессоров — восемь). Графический процессор организует аппаратную многопоточность, что позволяет задействовать все ресурсы графического процессора. Таким образом, открывается перспектива переложить функции физического ускорителя на графический ускоритель (пример реализации — PhysX). Также открываются широкие возможности использования графического оборудования компьютера для выполнения сложных неграфических вычислений в различных отраслях науки, например, в вычислительной биологии.
Преимущества
По сравнению с традиционным подходом к организации вычислений общего назначения посредством возможностей графических API, у архитектуры CUDA отмечают следующие преимущества в этой области:
- Интерфейс программирования приложений CUDA (CUDA API) основан на стандартном языке программирования Си с некоторыми ограничениями. По мнению разработчиков, это должно упростить и сгладить процесс изучения архитектуры CUDA[6];
- Разделяемая между потоками память (shared memory) размером в 16 Кб может быть использована под организованный пользователем кэш с более широкой полосой пропускания, чем при выборке из обычных текстур;
- Более эффективные транзакции между памятью центрального процессора и видеопамятью;
- Полная аппаратная поддержка целочисленных и побитовых операций;
- Поддержка компиляции кода GPU средствами открытого проекта LLVM[7].
Ограничения
- Все функции, выполнимые на устройстве, не поддерживают рекурсии (в версии CUDA Toolkit 3.1 поддерживает указатели и рекурсию) и имеют некоторые другие ограничения.
Поддерживаемые GPU и графические ускорители
Перечень устройств от производителя оборудования Nvidia с заявленной полной поддержкой технологии CUDA приведён на официальном сайте Nvidia[8][9].
Совместимость систем разработчика CUDA с поколениями вычислителей:
- CUDA SDK 6.0 поддерживает версии 1.0 — 3.5 (Tesla, Fermi, Kepler).
- CUDA SDK 6.5 поддерживает версии 1.0 — 5.x (Tesla, Fermi, Kepler, Maxwell).
- CUDA SDK 7.5 поддерживает версии 2.0 — 5.x (Fermi, Kepler, Maxwell).
- CUDA SDK 8.0 поддерживает версии 2.0 — 6.x (Fermi, Kepler, Maxwell, Pascal).
- CUDA SDK 9.0/9.1/9.2 поддерживает версии 3.0 — 7.2 (Kepler, Maxwell, Pascal, Volta)
- CUDA SDK 10.0 поддерживает версии 3.0 — 7.5 (Kepler, Maxwell, Pascal, Volta, Turing)
В настоящее время[когда?] на рынке аппаратных средств для ПК поддержку технологии CUDA обеспечивают следующие периферийные устройства:
- Модели Tesla C1060, Tesla S1070, Tesla C2050/C2070, Tesla M2050/M2070, Tesla S2050 позволяют производить вычисления на GPU с двойной точностью.
Пример
Этот пример кода на C++ загрузки текстур из изображения в массив на GPU:
cudaArray* cu_array;texture<float, 2> tex;// Выделение памяти для массиваcudaMalloc( &cu_array, cudaCreateChannelDesc<float>(), width, height );// Копируем данные изображения в массивcudaMemcpy( cu_array, image, width*height, cudaMemcpyHostToDevice);// Привязываем массив к текстуреcudaBindTexture( tex, cu_array);// Запускаем ядро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 [13]
import pycuda.driver as drvimport numpydrv.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))printdest-a*bСсылки
Официальные ресурсы
- CUDA Zone (англ.) — официальный сайт CUDA
- CUDA GPU Computing (англ.) — официальные веб-форумы, посвящённые вычислениям CUDA
- Курс лекций по CUDA (недоступная ссылка) (рус.) — официальный сайт NVidia
Неофициальные ресурсы
- Дмитрий Чеканов. nVidia CUDA: вычисления на видеокарте или смерть CPU? Tom's Hardware (22 июня 2008). Дата обращения: 20 января 2009.
- Дмитрий Чеканов. nVidia CUDA: тесты приложений на GPU для массового рынка. Tom's Hardware (19 мая 2009). Дата обращения: 19 мая 2009.
- Алексей Берилло. NVIDIA CUDA — неграфические вычисления на графических процессорах. Часть 1. iXBT.com (23 сентября 2008). Дата обращения: 20 января 2009.
- Алексей Берилло. NVIDIA CUDA — неграфические вычисления на графических процессорах. Часть 2. iXBT.com (22 октября 2008). — Примеры внедрения NVIDIA CUDA. Дата обращения: 20 января 2009.
Другие ресурсы
- Боресков Алексей Викторович. Основы CUDA (20 января 2009). Дата обращения: 20 января 2009.
- Владимир Фролов. Введение в технологию CUDA. Сетевой журнал «Компьютерная графика и мультимедиа» (19 декабря 2008). Дата обращения: 28 октября 2009. Архивировано 3 марта 2012 года.
- Игорь Осколков. NVIDIA CUDA – доступный билет в мир больших вычислений. Компьютерра (30 апреля 2009). Дата обращения: 3 мая 2009. Архивировано из оригинала 5 мая 2009 года.
- Владимир Фролов. Введение в технологию CUDA (1 августа 2009). Дата обращения: 3 апреля 2010. Архивировано 3 марта 2012 года.
- GPGPU.ruАрхивная копия от 31 августа 2020 на Wayback Machine. Использование видеокарт для вычислений (не обновляется с 2013 года).
- ParallelCompute.sourceforge.net. Центр Параллельных Вычислений.
Примечания
- ↑CUDA Toolkit 12.4 Downloads (англ.). NVIDIA. Дата обращения: 25 марта 2024. Архивировано 24 марта 2024 года.
- ↑Language SolutionsАрхивная копия от 16 октября 2018 на Wayback Machine / NVIDIA, (англ.)
- ↑PyCUDA | NVIDIA Developer. Дата обращения: 16 октября 2018. Архивировано 17 октября 2018 года.
- ↑MATLAB GPU Computing Support for NVIDIA CUDA-Enabled GPUs. Дата обращения: 1 сентября 2020. Архивировано 9 августа 2020 года.
- ↑Theo Valich. nVidia Launches CUDA Toolkit 3.0, expands OpenCL (англ.). Bright Side Of News (22 марта 2010). Дата обращения: 5 апреля 2010. Архивировано 3 марта 2012 года.
- ↑См. Официальное руководство по программированию на CUDA, вер. 1.1 // CUDA Programming GuideАрхивная копия от 6 октября 2008 на Wayback Machine. Chapter 1. Introduction to CUDA → 1.2 CUDA: A New Architecture for Computing on the GPU
- ↑NVIDIA передала CUDA Compiler в руки сообщества LLVM — opennet.ru. Дата обращения: 13 мая 2012. Архивировано 13 мая 2012 года.
- ↑CUDA-Enabled GPU ProductsАрхивная копия от 5 апреля 2008 на Wayback Machine (англ.)
- ↑Продукты с поддержкой CUDA — NVIDIA. Дата обращения: 26 февраля 2010. Архивировано 26 февраля 2010 года.
- ↑Larabel, Michael. NVIDIA Rolls Out Tegra X2 GPU Support In Nouveau. Phoronix (29 марта 2017). Дата обращения: 8 августа 2017. Архивировано 9 августа 2017 года.
- ↑Discussion of LUA compilation on Drive PX2. Bernhard Schuster. GitHub. Дата обращения: 9 ноября 2017. Архивировано 6 сентября 2020 года.
- ↑Nvidia Xavier SpecsАрхивная копия от 21 августа 2018 на Wayback Machine on TechPowerUp (preliminary)
- ↑PyCUDA. Архивировано 3 марта 2012 года.