CUDA
CUDA (англ. Compute Unified Device Architecture) — программно-аппаратная архитектура, позволяющая производить вычисления с использованием графических процессоров NVIDIA, поддерживающих технологию GPGPU (произвольных вычислений на видеокартах). Архитектура CUDA впервые появились на рынке с выходом чипа NVIDIA восьмого поколения — G80 и присутствует во всех последующих сериях графических чипов, которые используются в семействах ускорителей GeForce, Quadro и Tesla.
CUDA SDK позволяет программистам реализовывать на специальном упрощённом диалекте языка программирования Си алгоритмы, выполнимые на графических процессорах NVIDIA и включать специальные функции в текст программы на Cи. CUDA даёт разработчику возможность по своему усмотрению организовывать доступ к набору инструкций графического ускорителя и управлять его памятью, организовывать на нём сложные параллельные вычисления.
Программная архитектура
Первоначальная версия CUDA SDK была представлена 15 февраля 2007 года. В основе CUDA API лежит язык Си с некоторыми ограничениями. Для успешной трансляции кода на этом языке, в состав CUDA SDK входит собственный Си-компилятор командной строки nvcc компании Nvidia. Компилятор nvcc создан на основе открытого компилятора Open64 и предназначен для трансляции host-кода (главного, управляющего кода) и device-кода (аппаратного кода) (файлов с расширением .cu) в объектные файлы, пригодные в процессе сборки конечной программы или библиотеки в любой среде программирования, например в NetBeans.
Использует grid-модель памяти, кластерное моделирование потоков и SIMD инструкции. Применим в основном для высокопроизводительных графических вычислений и разработок NVIDIA-совместимого графического API. Включена возможность подключения к приложениям, использующим OpenGL и Microsoft Direct3D 9. Создан в версиях для Linux, Mac OS X, Windows.
22 марта 2010 года nVidia выпустила CUDA Toolkit 3.0, который содержал поддержку OpenCL.[1]
Оборудование
Первая серия оборудования, поддерживающая CUDA SDK, G8x, имела 32-битный векторный процессор одинарной точности, использующий CUDA SDK как API (CUDA поддерживает тип double
языка Си, однако сейчас его точность понижена до 32-битного с плавающей запятой). Более поздние процессоры GT200 имеют поддержку 64-битной точности (только для SFU), но производительность значительно хуже, чем для 32-битной точности (из-за того что SFU всего 2 на каждый потоковый мультипроцессор, а скалярных процессоров 8). Графический процессор организует аппаратную многопоточность, что позволяет задействовать все ресурсы графического процессора. Таким образом, открывается перспектива переложить функции физического ускорителя на графический ускоритель (пример реализации — nVidia PhysX). Также открываются широкие возможности использования графического оборудования компьютера для выполнения сложных неграфических вычислений: например, в вычислительной биологии и в иных отраслях науки.
Преимущества
По сравнению с традиционным подходом к организации вычислений общего назначения посредством возможностей графических API, у архитектуры CUDA отмечают следующие преимущества в этой области:
- Интерфейс программирования приложений CUDA (CUDA API) основан на стандартном языке программирования Си с некоторыми ограничениями. По мнению разработчиков, это должно упростить и сгладить процесс изучения архитектуры CUDA[2]
- Разделяемая между потоками память (shared memory) размером в 16 Кб может быть использована под организованный пользователем кэш с более широкой полосой пропускания, чем при выборке из обычных текстур
- Более эффективные транзакции между памятью центрального процессора и видеопамятью
- Полная аппаратная поддержка целочисленных и побитовых операций
Ограничения
- Все функции, выполнимые на устройстве, не поддерживают рекурсии (в версии CUDA Toolkit 3.1 поддерживает указатели и рекурсию) и имеют некоторые другие ограничения
- Архитектуру CUDA поддерживает и развивает только производитель NVidia
Поддерживаемые GPU и графические ускорители[3]
Перечень устройств от производителя оборудования Nvidia с заявленной полной поддержкой технологии CUDA приведён на официальном сайте Nvidia: CUDA-Enabled GPU Products (англ.).
Фактически же, в настоящее время на рынке аппаратных средств для ПК поддержку технологии CUDA обеспечивают следующие периферийные устройства[3]:
Compute capability (version) |
GPUs |
---|---|
1.0 | G80 |
1.1 | G86, G84, G98, G96, G96b, G94, G94b, G92, G92b |
1.2 | GT218, GT216, GT215 |
1.3 | GT200, GT200b |
2.0 | GF100, GF110 |
2.1 | GF108, GF106, GF104, GF114 |
|
|
|
|
Модели Tesla C1060, Tesla S1070, Tesla C2050/C2070, Tesla M2050/M2070, Tesla S2050 позволяют производить вычисления на GPU с двойной точностью.
Особенности и спецификации различных версий
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 |
Нет | Да | |||
Integer atomic functions operating on 64-bit words in global memory |
Нет | Да | |||
Integer atomic functions operating on 32-bit words in shared memory | |||||
Warp vote functions | |||||
Double-precision floating-point operations | Нет | Да | |||
Floating-point atomic addition operating on 32-bit words in global and shared memory |
Нет | Да | |||
_ballot() | |||||
_threadfence_system() | |||||
_syncthread_count(), _syncthread_and(), _syncthread_or() | |||||
Surface functions |
Technical specifications | Compute capability (version) | ||||
---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.x | |
Maximum x- or y- dimensions of a grid of thread blocks | 65535 | ||||
Maximum number of threads per block | 512 | 1024 | |||
Maximum x- or y- dimension of a block | 512 | 1024 | |||
Maximum z- dimension of a block | 64 | ||||
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 |
227 | ||||
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 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 |
Пример
Этот пример кода на 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 [4]
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
CUDA как предмет в вузах
По состоянию на декабрь 2009 года, программная модель CUDA преподается в 269 университетах по всему миру. В России обучающие курсы по CUDA читаются в Московском, Санкт-Петербургском, Казанском, Новосибирском и Пермском государственных университетах, Международном университете природы общества и человека «Дубна», Объединённом институте ядерных исследований, Московском институте электронной техники, Ивановском государственном энергетическом университете, БГТУ им. В. Г. Шухова, МГТУ им. Баумана, РХТУ им.Менделеева, Российском научном центре «Курчатовский институт», Межрегиональном суперкомпьютерном центре РАН, Таганрогском технологическом институте (ТТИ ЮФУ).[5] Кроме того, в декабре 2009 года было объявлено о начале работы первого в России научно-образовательного центра «Параллельные вычисления», расположенного в городе Дубна, в задачи которого входят обучение и консультации по решению сложных вычислительных задач на GPU.[5]
На Украине курсы по CUDA читаются в Киевском институте системного анализа.[5]
Ссылки
Официальные ресурсы
- CUDA Zone (рус.) — официальный сайт CUDA
- CUDA GPU Computing (англ.) — официальные веб-форумы, посвящённые вычислениям CUDA
Неофициальные ресурсы
- Дмитрий Чеканов. 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.
- Игорь Осколков. NVIDIA CUDA – доступный билет в мир больших вычислений . Компьютерра (30 апреля 2009). Дата обращения: 3 мая 2009.
- Владимир Фролов. Введение в технологию CUDA (1 августа 2009). Дата обращения: 3 апреля 2010.
- GPGPU.ru. Использование видеокарт для вычислений
Примечания
- ↑ Theo Valich. nVidia Launches CUDA Toolkit 3.0, expands OpenCL (англ.). Bright Side Of News (22 марта 2010). Дата обращения: 5 апреля 2010.
- ↑ См. Официальное руководство по программированию на CUDA, вер. 1.1 // CUDA Programming Guide. Chapter 1. Introduction to CUDA → 1.2 CUDA: A New Architecture for Computing on the GPU
- ↑ 1 2 Приобрели CUDA?
- ↑ PyCUDA .
- ↑ 1 2 3 Арсений Герасименко. В Дубне будут учить решать задачи на GPU и в среде CUDA . 3DNews (28 декабря 2009). Дата обращения: 10 февраля 2010.
См. также
Это заготовка статьи об информационных технологиях и вычислительной технике. Помогите Википедии, дополнив её. |