CUDA

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

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

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 позволяет включать в текст программы на C специальные функции. Эти функции пишутся на особом диалекте С, и выполняются на графическом процессоре.

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

Использует grid-модель памяти, кластерное моделирование потоков и SIMD инструкции. Применим в основном для высокопроизводительных графических вычислений и разработок NVIDIA-совместимого графического API. Включена возможность подключения к приложениям, использующим Microsoft Direct3D 9 и OpenGL. Создан в версиях для Linux, Mac OS X и 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 Кб может быть использована под организованный пользователем кэш с более широкой полосой пропускания, чем при выборке из обычных текстур
  • Более эффективные транзакции между памятью центрального процессора и видеопамятью
  • Полная аппаратная поддержка целочисленных и побитовых операций

Ограничения

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

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

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

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

Nvidia GeForce
GeForce GTX 295
GeForce GTX 285
GeForce GTX 280
GeForce GTX 275
GeForce GTX 260
GeForce GTS 250
GeForce GT 240
GeForce GT 220
GeForce 210
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

CUDA как предмет в ВУЗах

По состоянию на декабрь 2009 года, программная модель CUDA преподается в 269 университетах по всему миру. В России обучающие курсы по CUDA читаются в Московском, Санкт-Петербургском, Казанском, Новосибирском и Пермском государственных университетах, Международном университете природы общества и человека «Дубна», Объединённом институте ядерных исследований, Московском институте электронной техники, Ивановском электронно-техническом институте, МГТУ им. Баумана, Российском научном центре «Курчатовский институт», Межрегиональном суперкомпьютерном центре РАН, Таганрогском технологическом институте (ТТИ ЮФУ).[4] Кроме того, в декабре 2009 года было объявлено о начале работы первого в России научно-образовательный центр «Параллельные вычисления», расположенного в городе Дубна, в задачи которого входит обучение и консультации по решению сложных вычислительных задач на GPU.[4]

На Украине курсы по CUDA читаются в Киевском институте системного анализа.[4]

Ссылки

Официальные ресурсы

Неофициальные ресурсы

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. 2,0 2,1 http://www.nvidia.ru/object/cuda_learn_products_ru.html
  3. PyCUDA.
  4. 4,0 4,1 4,2 Арсений Герасименко В Дубне будут учить решать задачи на GPU и в среде CUDA. 3DNews (28 декабря 2009 года). Проверено 10 февраля 2010.

См. также

af:CUDA

ar:كودا de:Compute Unified Device Architecture en:CUDA es:CUDA fi:CUDA fr:Compute Unified Device Architecture ja:CUDA ko:쿠다 ml:ക്യൂഡ nl:CUDA pl:CUDA (informatyka) pt:Compute Unified Device Architecture sv:CUDA tr:Cuda uk:CUDA vi:CUDA zh:CUDA

Источник — «http://www.sbup.com/wiki/CUDA»
Личные инструменты

Served in 0.417 secs.