Анатолий Свириденков (сodedgers.com) Блог:

Презентация:



Advertisements
Похожие презентации
Часть I: Введение в CUDA Александр Межов Ассистент кафедры Информатики 30 сентября 2011 Кафедра Информатики.
Advertisements

CONFLUX: GPGPU ДЛЯ.NET Евгений Бурмако Андрей Воронович.
Многопроцессорные системы (продолжение). Графические ускорители. Использование графических ускорителей.
Технологии высокопроизводительных вычислений на GPU и гибридных вычислительных системах Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Томский.
Структура ПО CUDA Приложения, использующие возможности CUDA для параллельной обработки данных, взаимодействуют с GPU через несколько разных программных.
Половинкин А.Н.. Постановка задачи Алгоритм вычисления функции axpy на GPU Программная реализация.
Половинкин А.Н.. Постановка задачи Алгоритм умножения матриц на GPU Программная реализация.
Архитектура и программирование массивно-параллельных вычислительных систем zЛекторы: yБоресков А.В. (ВМиК МГУ)Боресков А.В. (ВМиК МГУ) yХарламов А. (NVidia)Харламов.
Половинкин А.Н.. Вычисления общего назначения на GPU Архитектура GPU Программная модель выполнения на CUDA Программирование с использованием CUDA Настольная.
Лекторы: Боресков А.В. (ВМиК МГУ) Харламов А. (NVidia) Архитектура и программирование массивно- параллельных вычислительных систем.
Факультет прикладной математики и физики Кафедра вычислительной математики и программирования МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ (национальный исследовательский.
МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ (национальный исследовательский университет) (национальный исследовательский университет) Факультет прикладной математики.
Лихогруд Николай Часть первая.
Лекторы: Боресков А.В. (ВМиК МГУ) Харламов А.А. (NVidia) CUDA Stream. Иерархия памяти в CUDA. Глобальная память.
Параллельные аппаратные архитектуры и модели программирования Традиционная архитектура фон Неймана Расширение традиционной архитектуры Сопроцессоры Многоядерные.
Лекторы: Боресков А.В. (ВМиК МГУ) Харламов А. (NVIDIA) Архитектура и программирование массивно- параллельных вычислительных систем.
Массивно-параллельные вычислительные системы на основе архитектуры CUDA.
Лекторы: Боресков А.В. (ВМиК МГУ) Харламов А. (NVidia) Архитектура и программирование массивно- параллельных вычислительных систем.
Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ.
Лекторы: Боресков А.В. (ВМиК МГУ) Харламов А.А. (NVidia) CUDA Stream. Иерархия памяти в CUDA. Глобальная память.
Транксрипт:

Анатолий Свириденков (сodedgers.com) Блог:

Проблематика Где нужна вычислительная мощность: - Ускорение вычислений - Переход в реальное время - Разгрузка CPU - Улучшение качества

Чего ожидать от параллелизма Закон Амдала (ускорение от параллелизма): Sp = 1 / (a + (1 – a) / p) p – количество потоков a – доля последовательных вычислений p = 2p = 8p = 1000 a = 0,9 1,051,11,11 a = 0,5 1,331,772,0 a = 0,1 1,814,719,91

- Параллелизм данных, DPL: MMX, SSE, и т. д. - Параллелизм кода, IPL: спекулятивные вычисления и конвейер, VLIW - Квази многопоточность, многоядерность, hyper threading - Кластеры Примеры параллелизма

Предыстория к GPGPU Сопроцессор Видео- ускоритель Шейдеры GPU

Рост производительности GigaFLOPS годы GPU CPU

Терминология - host - CPU - device - GPU - ядро код запускаемого на GPU из основного приложения - поток часть вычислений исполняемых параллельно - сетка (grid) все множество потоков для одного ядра - блок набор потоков исполняемых на одном SM - warp набор потоков физически исполняемых параллельно

Программная модель памяти ТипДоступРасположение Латентность Регистры Поток GPU (R\W)SM 2-4 такта ЛокальнаяПоток GPU (R\W)DRAM ~500 тактов РазделяемаяБлок потоков GPU (R\W)SM 2-4 такта ГлобальнаяCPU(R\W), GPU(R\W)DRAM ~500 тактов Константная CPU(R\W), GPU(Read-only)DRAM + КЕШ SM ~500 к DRAM 2-4 к кешу Текстурная CPU(R\W), GPU(Read-only) DRAM + КЕШ SM ~500 к DRAM 2-4 к кешу

Программная модель потоков B (0:0) B (0:1) B (0:2) B (0:3) B (1:0) B (1:1) B (1:2) B (1:3) B (2:0) B (2:1) B (2:2) B (2:3) B (3:0) B (3:1) B (3:2) B (3:3) B (4:0) B (4:1) B (4:2) B (4:3) Grid Block T (0:0:0) T (0:1:0) T (0:2:0) T (1:0:0) T (1:1:0) T (1:2:0) T (2:0:0) T (2:1:0) T (2:2:0) Приведен пример сетки из 20 блоков (5x4), в каждом блоке 18 (3x3x2) потоков. Всего в сетке 360 потоков.

Особенности программирования - функция ядро возвращает только void - память узкое место в вычисленях и требует особого внимания - шина PCI-Express узкое место в вычислениях - ветвления внутри warp снижают быстродействие

Программный стек CUDA Device Host CUDA Driver CUDA Driver API CUDA Runtime API Libraries Application

Последняя версия CUDA Toolkit 4.0 RC2 - Состав: - Драйвер для разработчиков - GPU Computing SDK GPU Computing SDK: - Компилятор - Набор утилит - Документация - Библиотеки (CUBLAS, CUSPARSE) - Примеры CUDA Toolkit

Самый важный параметр: --help (-help) печатает справку Основные выходные форматы (и ключи компиляции): --cubin (-cubin) компилирует в виртуальный формат cubin --ptx (-ptx) компиляция в ассемблер для gpu --gpu (-gpu) компиляция в бинарный формат NVIDIA Parallel nSight специально разработан для работы в Visual Studio Компилятор NVCC

Типы функций ОбозначениеГде расположенаКто может вызывать __global__GPUCPU __device__GPU __host__CPU - по умолчанию все функции __host__ - __host__ и __device__ совместимы, компилятор создаст две версии: для CPU и GPU __global__ void sum(float *c, float *a, float b); __host__ __device__ float add(float a, float b);

Hello World! Сложение массивов. #define N1024 // GPU __global__ void sum(float *c, float *a, float *b) { int index = blockIdx.x * blockDim.x + threadIdx.x; c[index] = a[index] + b[index]; } // CPU void sum(float *c, float *a, float b) { for(int i = 0; i < N; i++) { c[i] = a[i] + b[i]; } Встроеные константы: blockIdx номер блока у текущего потока; blockDim количество блоков; threadIdx номер потока в блоке.

Hello World! CPU инициализация int main(int argc, char **argv) { float *a, *b, *c; float *A, *B, *C; a = (float*) malloc(N * sizeof(float)); b = (float*) malloc(N * sizeof(float)); c = (float*) malloc(N * sizeof(float)); cudaMalloc((void **)&A, N * sizeof(float)); cudaMalloc((void **)&B, N * sizeof(float)); cudaMalloc((void **)&C, N * sizeof(float)); for(int i = 0; i < N; i++) { a[i] = RandFloat(0.0f, 1.0f); b[i] = RandFloat(0.0f, 1.0f); }

Hello World! CPU вызов ядра cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice); sum >>(C, A, B); cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost); cudaFree(A); cudaFree(B); cudaFree(C); free(a); free(b); free(c); }

Hello World! CPU вызов ядра cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice); sum >>(C, A, B); cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost); cudaFree(A); cudaFree(B); cudaFree(C); free(a); free(b); free(c); }

Hello World! CPU вызов ядра cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice); sum >>(C, A, B); cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost); cudaFree(A); cudaFree(B); cudaFree(C); free(a); free(b); free(c); }

Hello World! CPU вызов ядра cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice); sum >>(C, A, B); cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost); cudaFree(A); cudaFree(B); cudaFree(C); free(a); free(b); free(c); }

GPGPU прочее DirectCompute библиотека от Microsoft. Часть DirectX; OpenCL кроссплатформенная библиотека; Готовые библиотеки с поддержкой GPGPU: - OpenCV обработка изображения и компьютерное зрение - CUBLAS математические вычисления - CUFFT быстрые преобразования фурье - CUSPARSE библиотека линейной алгебры Пакеты ПО со встроенной поддержкой GPU, например Matlab

OpenCV #include #include "opencv2/opencv.hpp" #include "opencv2/gpu/gpu.hpp" int main (int argc, char* argv[]) { cv::gpu::GpuMat dst, src = cv::imread("file.png", CV_LOAD_IMAGE_GRAYSCALE); cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY); cv::imshow("Result", dst); cv::waitKey(); return 0; }

Ссылки: о CUDAhttp:// OpenCLhttp:// DirectCompute подборка информации по GPGPUhttp://gpgpu.org/ GPGPU по-русски - skype: sviridenkov.anatoliy блог Контакты: