Технология Nvidia CUDA (L/R) 2009

Методически указания за лабораторната работа "Технология Nvidia CUDA" за курса "Организация на компютри и системи"

Съставител: доц. Андреев А.Е., Шаповалов О.В. Волгоградски държавен технически университет.

Съдържанието на ръководството (без снимки):

Списък на NVIDIA CUDA

Има още едно ниво, дори по-високо - две библиотеки:

CUBLAS - вариант CUDA на BLAS (Основни подпрограми за линейна алгебра), предназначен за изчисляване на линейни алгебрични проблеми и използване на директен достъп до GPU ресурси;

CUFFT - CUDA версия на библиотеката Fast Fourier Transform за изчисляване на Fast Fourier Transform, която се използва широко при обработката на сигнали. Поддържат се следните типове трансформация: сложен комплекс (C2C), реален комплекс (R2C) и сложен реален (C2R).

Писане на програми CUDA

При изпълнение на програма централният процесор изпълнява своите части от кода, а GPU изпълнява CUDA кода с най-тежките паралелни изчисления. Тази част, посветена на GPU, се нарича ядро. Ядрото определя операциите, които ще бъдат извършени върху данните.

По този начин CUDA използва паралелен изчислителен модел, където всеки от SIMD процесорите изпълнява една и съща инструкция на различни елементи от данни паралелно. GPU е изчислително устройство (устройство) за централен процесор (хост), което има собствена памет и паралелно обработва голям брой нишки. Ядрото е функция за GPU, която се изпълнява от нишки. Видеочипът се различава от процесора по това, че може да обработва едновременно стотици хиляди нишки, което обикновено е за графики, които са добре паралелизирани.

Моделът за програмиране CUDA предполага групиране на нишки. Нишките се комбинират в нишковидни блокове - едномерни или двумерни мрежи от нишки, които взаимодействат помежду си, използвайки споделена памет и точки за синхронизация. Програмата (ядрото) работи върху мрежа от блокове на нишки, вижте фигурата по-долу. Една мрежа се изпълнява наведнъж. Всеки блок може да има едно-, дву- или триизмерна форма и може да има 512 нишки на текущия хардуер.

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

Като пример, разгледайте проблема за умножаването на квадратна матрица по вектор.

Първоначални данни:
A [n] [n] - матрица с размерност n x n;
b [n] е вектор, състоящ се от n елемента.

Резултат:
c [n] - вектор на n елемента.
// Последователен алгоритъм за умножение на матрица-вектор

за (i = 0; i >> (d_c, d_a, d_b, Размер);

// свободна памет
CUDA_SAFE_CALL (cudaFree (d_a));
CUDA_SAFE_CALL (cudaFree (d_b));
CUDA_SAFE_CALL (cudaFree (d_c));

extern "C" __global__ void MatrVectMul (float * d_c, float * d_a, float * d_b, int Size)