Exit

Уроки онлайн

Уровень

Технология CUDA

CUDA, Compute Unified Device Architecture программно-аппаратная архитектура, позволяющая производить вычисления с использованием графических процессоров NVIDIA, поддерживающих технологию GPGPU (произвольных вычислений на видеокартах). Впервые появились на рынке с выходом чипа NVIDIA восьмого поколения - G80 и присутствует во всех последующих сериях графических чипов, которые используются в семействах ускорителей GeForce, Quadro и NVidia Tesla.

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

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

Кстати, заметим. что современные локомотивы вычислительной техники - самые мощные суперкомпьютеры, такие как TITANIUM, построены на "детских самокатах" - видеокартах игровых компьютеров, имеющих графические процессоры с тысячами параллельно работающих ядер.

Программная архитектура CUDA

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

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

22 марта 2010 года nVidia выпустила CUDA Toolkit 3.0, который содержал поддержку OpenCL.

Оборудование CUDA

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

Преимущества CUDA

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

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

Ограничения CUDA

Все функции, выполнимые на устройстве, не поддерживают рекурсии (в версии CUDA Toolkit 3.1 поддерживает указатели и рекурсию) и имеют некоторые другие ограничения

Архитектуру CUDA поддерживает и развивает только производитель NVidia

Поддерживаемые GPU и графические ускорители CUDA

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

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

версия CUDA

Графические процессоры (GPU)

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, GF116

Nvidia GeForce для десктопов

GeForce GTX 590, GTX 580, GTX 570, GTX 560 Ti, GTX 560, GTX 550 Ti, GTX 520, GTX 480, GTX 470, GTX 465, GTX 460, GTS 450, GTX 295, GTX 285, GTX 280, GTX 275, GTX 260, GTS 250, GT 240, GT 220, GT 210, GTS 150, GT 130, GT 120, G100, 9800 GX2, 9800 GTX+, 9800 GTX, 9800 GT, 9600 GSO, 9600 GT, 9500 GT, 9400 GT, 9400 mGPU, 9300 mGPU, 8800 GTS 512, 8800 GT, 8600 GTS, 8600 GT, 8500 GT, 8400 GS

Nvidia GeForce для мобильных устройств

GeForce GTX 580M, GTX 570M, GTX 560M, GT 555M, GT 540M, GT 525M, GT 520M, GTX 485M, GTX 480M, GTX 470M, GTX 460M, GT 445M, GT 435M, GT 425M, GT 420M, GT 415M, GTX 285M, GTX 280M, GTX 260M, GTS 360M, GTS 350M, GTS 160M, GTS 150M, GT 335M, GT 330M, GT 325M, GT 240M, GT 130M, G110M, G105M, 310M, 305M, 9800M GTX, 9800M GT, 9800M GTS, 9700M GTS, 9700M GT, 9650M GS, 9600M GT, 9600M GS, 9500M GS, 9500M G, 9300M GS, 9300M G, 9200M GS, 9100M G, 8800M GTS, 8700M GT, 8600M GT, 8600M GS, 8400M GT, 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 880M, Quadro FX 770M, Quadro FX 570M, Quadro FX 380M, Quadro FX 370M, Quadro FX 360M, Quadro NVS 5100M, 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 с двойной точностью.

Особенности и спецификации различных версий

 

 

 

 

Пример программирования CUDA

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

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