Лучшие вопросы
Таймлайн
Чат
Перспективы

CUDA

программно-аппаратная архитектура параллельных вычислений Из Википедии, свободной энциклопедии

CUDA
Remove ads

CUDA (изначально аббр. от англ. Compute Unified Device Architecture) — программно-аппаратная архитектура параллельных вычислений, которая позволяет существенно увеличить вычислительную производительность благодаря использованию графических процессоров фирмы Nvidia.

CUDA SDK позволяет программистам реализовывать на специальных упрощённых диалектах языков программирования Си, C++ и Фортран алгоритмы, выполнимые на графических и тензорных процессорах Nvidia[2]. Архитектура CUDA даёт разработчику возможность по своему усмотрению организовывать доступ к набору инструкций графического или тензорного ускорителя и управлять его памятью. Функции, ускоренные при помощи CUDA, можно вызывать из различных языков, в том числе Python[3], MATLAB[4] и т. п.

Remove ads

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

Суммиров вкратце
Перспектива

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].

Remove ads

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

Суммиров вкратце
Перспектива

Платформа CUDA впервые появились на рынке с выходом чипа NVIDIA восьмого поколения G80 и стала присутствовать во всех последующих сериях графических чипов, которые используются в семействах ускорителей GeForce, Quadro и NVidia Tesla.

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

Remove ads

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

По сравнению с традиционным подходом к организации вычислений общего назначения посредством возможностей графических 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 обеспечивают следующие периферийные устройства:

Подробнее Версия спецификации, Архитектура ...
Подробнее Nvidia GeForce для настольных компьютеров, Nvidia GeForce для мобильных компьютеров ...
  • Модели Tesla C1060, Tesla S1070, Tesla C2050/C2070, Tesla M2050/M2070, Tesla S2050 позволяют производить вычисления на GPU с двойной точностью.
Remove ads

Пример

Суммиров вкратце
Перспектива

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

Ссылки

Суммиров вкратце
Перспектива

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

  • CUDA Zone (англ.) — официальный сайт CUDA
  • CUDA GPU Computing (англ.) — официальные веб-форумы, посвящённые вычислениям CUDA
  • Курс лекций по CUDA (недоступная ссылка) (рус.) — официальный сайт NVidia

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

Tom's Hardware

iXBT.com

Другие ресурсы

Remove ads

Примечания

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads