CUDA

Материал из Википедии — свободной энциклопедии

Перейти к: навигация, поиск

CUDA (англ. Compute Unified Device Architecture) — технология GPGPU (англ. General-Purpose computing on Graphics Processing Units), позволяющая программистам реализовывать на языке программирования Си алгоритмы, выполнимые на графических процессорах ускорителей GeForce восьмого поколения и старше (GeForce 8 Series, GeForce 9 Series, GeForce 200 Series), Nvidia Quadro и Tesla компании Nvidia. Технология CUDA разработана компанией nVidia.

Технология CUDA - это среда разработки на Си, которая позволяет программистам и разработчикам писать программное обеспечение для решения сложных вычислительных задач за меньшее время благодаря многоядерной вычислительной мощности графических процессоров. Проще говоря, графическая подсистема компьютера с поддержкой CUDA может быть использована, как вычислительная.

CUDA даёт разработчику возможность по своему усмотрению организовывать доступ к набору инструкций графического ускорителя и управлять его памятью, организовывать на нём сложные параллельные вычисления. Графический ускоритель с поддержкой CUDA становится мощной программируемой открытой архитектурой подобно сегодняшним центральным процессорам.

Всё это предоставляет в распоряжение разработчика низкоуровневый, распределяемый и высокоскоростной доступ к оборудованию, делая CUDA необходимой основой при построении серьёзных высокоуровневых инструментов, таких как компиляторы, отладчики, математические библиотеки, программные платформы.

Использует grid-модель памяти, кластерное моделирование потоков и SIMD инструкции. Применим в основном для высокопроизводительных графических вычислений и разработок NVIDIA-совместимого графического API. Включена возможность подключения к приложениям, использующим Microsoft Direct3D 9 и OpenGL. Создан в версиях для Linux и Windows.

Первоначальная версия CUDA SDK была представлена 15 февраля 2007 года. В основе CUDA API лежит расширенный язык Си. Для успешной трансляции кода на этом языке, в состав CUDA SDK входит собственный Си-компилятор командной строки nvcc компании Nvidia. Компилятор nvcc создан на основе открытого компилятора Open64 и предназначен для трансляции host-кода (главного, управляющего кода) и device-кода (аппаратного кода) (файлов с расширением .cu) в объектные файлы, пригодные в процессе сборки конечной программы или библиотеки в любой среде программирования, например в Microsoft Visual Studio.

Содержание

[править] Программная архитектура

[править] Оборудование

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

[править] Преимущества

По сравнению с традиционным подходом к организации вычислений общего назначения посредством возможностей графических API, у архитектуры CUDA отмечают следующие преимущества в этой области:

  • Интерфейс программирования приложений CUDA (CUDA API) основан на стандартном языке программирования Си с небольшими расширениями. По мнению разработчиков, это должно упростить и сгладить процеcс изучения архитектуры CUDA[1]
  • Разделяемая между потоками память (shared memory) размером в 16 Кб может быть использована под организованный пользователем кэш с более широкой полосой пропускания, чем при выборке из обычных текстур
  • Более эффективные транзакции между памятью центрального процессора и видеопамятью
  • Полная аппаратная поддержка целочисленных и побитовых операций

[править] Ограничения

  • Все функции, выполнимые на устройстве, не поддерживают рекурсии
  • Минимальная ширина блока составляет 32 потока
  • Архитектуру CUDA поддерживает и развивает только производитель NVidia

[править] Поддерживаемые графические ускорители[2]

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

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

Nvidia GeForce
GeForce GTX 275
GeForce GTX 295
GeForce GTX 285
GeForce GTX 280
GeForce GTX 260
GeForce GTS 250
GeForce 9800 GX2
GeForce 9800 GTX+
GeForce 9800 GTX
GeForce 9800 GT
GeForce 9600 GT
GeForce 9600 GSO
GeForce 9500 GT
GeForce 9200M GS
GeForce 8800 Ultra
GeForce 8800 GTX
GeForce 8800 GTS
GeForce 8600 GTS
GeForce 8800 GT
GeForce 8800 GS
GeForce 8600 GT
GeForce 8500 GT
GeForce 8400 GS
GeForce 8800M GTX
GeForce 8800M GTS
GeForce 8700M GT
GeForce 8600M GT
GeForce 8600M GS
GeForce 8400M GT
GeForce 8400M GS
GeForce 8400M G
Nvidia Tesla
Tesla C870
Tesla C1060
Tesla D870
Tesla S870
Tesla S1070
Nvidia Quadro
Quadro FX 5800
Quadro FX 5600
Quadro FX 4800
Quadro FX 4600
Quadro FX 3700
Quadro FX 1700
Quadro FX 570
Quadro FX 370
Quadro NVS 130M
Quadro NVS 135M
Quadro NVS 140M
Quadro NVS 290
Quadro NVS 320M
Quadro FX 1600M
Quadro FX 570M
Quadro FX 360M
Quadro Plex 2100 D4
Quadro Plex 2200 D2
Quadro Plex 2100 S4
Quadro Plex 2200 S4

И новые модели Tesla C1060 и Tesla S1070, позволяющие производить вычисления на GPU с двойной точностью.

[править] Пример

Этот пример кода на 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;
}

Пример программы на Питоне, перемножающий матрицы средствами GPU. Взаимодействие идёт с использованием PyCUDA [3]

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

[править] Ссылки

[править] Официальные ресурсы

[править] Неофициальные ресурсы

Tom's Hardware
iXBT.com
Другие ресурсы

[править] Примечания

  1. См. Официальное руководство по программированию на CUDA, вер. 1.1 // CUDA Programming Guide. Chapter 1. Introduction to CUDA → 1.2 CUDA: A New Architecture for Computing on the GPU
  2. 1 2 http://www.nvidia.ru/object/cuda_learn_products_ru.html
  3. PyCUDA.

[править] См. также

Источник — «http://ru.wikipedia.org/wiki/CUDA»