Python + GPGPU
Ожидания и реалии
Докладчик: Евгений Петренко
Содержание
1. Обзор технологии
2. PyCUDA + примеры
3. Процесс разработки
4. Модель памяти и исполнения
5. Особенности оптимизации программ
6. Типичные задачи
7. Мой опыт
8. Средства отладки и профилирования
9. Мотивация для использования
Обзор технологии – Немного истории
Обзор технологии – Немного истории
Обзор технологии - Почему CUDA?
Скажи холивару «Нет!»
Prons:
1. Soft & Hard – подогнаны друг под
друга.
2. Производительность выше до 30%
3. Есть специализированные
вычислительные платы: Tesla K80
4. Множество обучающих материалов и
разных работ выполненных на CUDA.
Cons:
1. Только железо Nvidia
Обзор технологии – Устройство GPU
Обзор технологии – Устройство GPU
Обзор технологии - SDK
Полезные ссылки:
 Скачать CUDA
PyCUDA + Примеры
$pip install pycuda
Полезные ссылки:
 Wiki по установке PyCUDA
 Неофициальные сборки PyCUDA
PyCUDA + Примеры
import pycuda.autoinit
import pycuda.driver as drv
import numpy
from pycuda.compiler import SourceModule
mod = SourceModule(“””
__global__ void add_vect(float *dest, float *a, float *b){
const int i = threadIdx.x;
dest[i] = a[i] * b[i];
}
“””)
func = mod.get_function(“add_vec”)
func(drv.Out(dest), drv.In(a), drv.In(b), block=(400,1,1), grid=(1,1))
PyCUDA + Примеры
import pycuda.autoinit
import pycuda.driver as drv
import numpy
from pycuda.compiler import SourceModule
mod = SourceModule(“””
__global__ void mult_matrix(float *dest, float *a, float *b, int N){
const int tx = threadIdx.x;
const int ty = threadIdx.y;
const int i = tx*N + ty;
dest[i] = 0;
for(int k = 0; k < n; k++){
dest[i] = a[tx*N + k] * b[k*N + ty];
}
}
“””)
func = mod.get_function(“mult_matrix”)
func(drv.Out(dest), drv.In(a), drv.In(b), block=(40,40,1), grid=(1,1))
PyCUDA + Примеры
__global__ void kernelBlur(uchar4* in_image, uchar4* out_image, int w, int h){
int i = blockIdx.y*blockDim.y + threadIdx.y;//row
int j = blockIdx.x*blockDim.x + threadIdx.x;//colomn
if(i >= h || j >= w) return;
if(i == 0 || i == h-1 || j == 0 || j == w-1){
out_image[i*w+j].x = in_image[i*w+j].x;
…
return;
}
int red = 0, green = 0, blue = 0;
for(int k = -1; k < 2; ++k){
for(int m = -1; m < 2; ++m){
red += Blur[(k+1)*3+(m+1)]*in_image[(i+k)*w+j+m].x;
}
}
out_image[i*w+j].x = red/blurSumm;
…
out_image[i*w+j].w = in_image[i*w+j].w;
}
Процесс разработки
 Основные термины: блок, сетка (grid),
import pycuda.autoinit
import pycuda.driver as drv
import numpy
from pycuda.compiler import SourceModule
mod = SourceModule(“””
__global__ void kernel(/*parameters*/){
//your code
}
“””)
func = mod.get_function(“kernel”)
func(…)
Модель памяти и исполнения
 Несложно написать программу, очень сложно написать ее эффективно
Полезные ссылки:
 Документация CUDA
Модель памяти и исполнения
 Сетка и блоки - самое важное
 Как это все ложится на физическую архитектуру – важно для
эффективности.
 Распределение потоков по физическим ядрам
 Обработка ветвлений
Модель памяти и исполнения
 Много видов памяти
 Важно знать для написания
эффективных программ
Особенности оптимизации программ
Примеры, которые я показал ранее не особо эффективные
Решение:
 Разбить входные данные на блоки
Особенности оптимизации программ
__global__ mult_matrix(float *C, float *A, float *B, int wA, int wB){
//Конфигурации
float Csub = 0;
for (int a = aBegin, b = bBegin;
a <= aEnd;
a += aStep, b += bStep){
__shared__ float As[BLOCK_SIZE][BLOCK_SIZE];
__shared__ float Bs[BLOCK_SIZE][BLOCK_SIZE];
As[ty][tx] = A[a + wA * ty + tx];
Bs[ty][tx] = B[b + wB * ty + tx];
__syncthreads();
for (int k = 0; k < BLOCK_SIZE; ++k){
Csub += As[ty][k] * Bs[k][tx];
}
__syncthreads();
}
int c = wB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
C[c + wB * ty + tx] = Csub;
}
Типичные задачи – map/reduce
 Map – реализуется довольно просто
 С reduce возникают сложности
Типичные задачи – Обработка
сигналов
 Изображения
 Аудио
 Видео
 Фильтрация
 Кодирование
 Декодированиe
Типичные задачи – Big Data
 Анализ больших данных
 Классификация
 Кластеризация
 Регрессия
 Машинное обучение
 Алгоритмы требующие обучения
 Нейросети
Полезные ссылки:
 Theano
Типичные задачи – Трассировка лучей
Пример кода:
mod = SourceModule(“””
__device__ void distance(float3 point, float3 ray_orig, float3 ray_dir,
Scene* scene){
//code
}
__device__ void calc_color(float3 point, float3 normal,
Material* mat, Scene* scene){
//code
}
__global__ void kernel(…, uchar4 out_imate, int w, int h){
//your code
}
“””)
Типичные задачи – Трассировка лучей
 VirtualRay
Типичные задачи – Трассировка лучей
Типичные задачи – Полный матан
 Решение дифуров
 Решение задач нелинейной оптимизации
 Мой опыт как раз относится к этому
Мой опыт – Метод сопряженных
градиентов
Мой опыт – Раскладка графа
Мой опыт – Раскладка графа
Количество
переменных
Количество
итераций
Время (с)
254 635 3.147
2046 5115 301.11
8190 20475 4640.31
Количество
переменных
Количество
итераций
Время (с) Прирост
254 635 1.974 1.59
2046 5115 113.1 2.66
8190 20475 1413.5 3.28
Inel Core i5, OpenMP
GeForce 650 GTX, CUDA
Средства отладки и профилирования
 Nsight
 Visual profiler
Полезные ссылки:
 Руководство пользователя Visual Profiler
Средства отладки и профилирования
Мотивация для использования
 Утилизация (абсолютно) всех ресурсов компьютера
 Чтобы не усложнять процесс, есть оптимизированные библиотеки
 GPUArrays (вместо CUBLAS)
 CURAND
 …
За здравствует код!
Место для Ваших вопросов

Python + GPGPU

  • 1.
    Python + GPGPU Ожиданияи реалии Докладчик: Евгений Петренко
  • 2.
    Содержание 1. Обзор технологии 2.PyCUDA + примеры 3. Процесс разработки 4. Модель памяти и исполнения 5. Особенности оптимизации программ 6. Типичные задачи 7. Мой опыт 8. Средства отладки и профилирования 9. Мотивация для использования
  • 3.
    Обзор технологии –Немного истории
  • 4.
    Обзор технологии –Немного истории
  • 5.
    Обзор технологии -Почему CUDA? Скажи холивару «Нет!» Prons: 1. Soft & Hard – подогнаны друг под друга. 2. Производительность выше до 30% 3. Есть специализированные вычислительные платы: Tesla K80 4. Множество обучающих материалов и разных работ выполненных на CUDA. Cons: 1. Только железо Nvidia
  • 6.
    Обзор технологии –Устройство GPU
  • 7.
    Обзор технологии –Устройство GPU
  • 8.
    Обзор технологии -SDK Полезные ссылки:  Скачать CUDA
  • 9.
    PyCUDA + Примеры $pipinstall pycuda Полезные ссылки:  Wiki по установке PyCUDA  Неофициальные сборки PyCUDA
  • 10.
    PyCUDA + Примеры importpycuda.autoinit import pycuda.driver as drv import numpy from pycuda.compiler import SourceModule mod = SourceModule(“”” __global__ void add_vect(float *dest, float *a, float *b){ const int i = threadIdx.x; dest[i] = a[i] * b[i]; } “””) func = mod.get_function(“add_vec”) func(drv.Out(dest), drv.In(a), drv.In(b), block=(400,1,1), grid=(1,1))
  • 11.
    PyCUDA + Примеры importpycuda.autoinit import pycuda.driver as drv import numpy from pycuda.compiler import SourceModule mod = SourceModule(“”” __global__ void mult_matrix(float *dest, float *a, float *b, int N){ const int tx = threadIdx.x; const int ty = threadIdx.y; const int i = tx*N + ty; dest[i] = 0; for(int k = 0; k < n; k++){ dest[i] = a[tx*N + k] * b[k*N + ty]; } } “””) func = mod.get_function(“mult_matrix”) func(drv.Out(dest), drv.In(a), drv.In(b), block=(40,40,1), grid=(1,1))
  • 12.
    PyCUDA + Примеры __global__void kernelBlur(uchar4* in_image, uchar4* out_image, int w, int h){ int i = blockIdx.y*blockDim.y + threadIdx.y;//row int j = blockIdx.x*blockDim.x + threadIdx.x;//colomn if(i >= h || j >= w) return; if(i == 0 || i == h-1 || j == 0 || j == w-1){ out_image[i*w+j].x = in_image[i*w+j].x; … return; } int red = 0, green = 0, blue = 0; for(int k = -1; k < 2; ++k){ for(int m = -1; m < 2; ++m){ red += Blur[(k+1)*3+(m+1)]*in_image[(i+k)*w+j+m].x; } } out_image[i*w+j].x = red/blurSumm; … out_image[i*w+j].w = in_image[i*w+j].w; }
  • 13.
    Процесс разработки  Основныетермины: блок, сетка (grid), import pycuda.autoinit import pycuda.driver as drv import numpy from pycuda.compiler import SourceModule mod = SourceModule(“”” __global__ void kernel(/*parameters*/){ //your code } “””) func = mod.get_function(“kernel”) func(…)
  • 14.
    Модель памяти иисполнения  Несложно написать программу, очень сложно написать ее эффективно Полезные ссылки:  Документация CUDA
  • 15.
    Модель памяти иисполнения  Сетка и блоки - самое важное  Как это все ложится на физическую архитектуру – важно для эффективности.  Распределение потоков по физическим ядрам  Обработка ветвлений
  • 16.
    Модель памяти иисполнения  Много видов памяти  Важно знать для написания эффективных программ
  • 17.
    Особенности оптимизации программ Примеры,которые я показал ранее не особо эффективные Решение:  Разбить входные данные на блоки
  • 18.
    Особенности оптимизации программ __global__mult_matrix(float *C, float *A, float *B, int wA, int wB){ //Конфигурации float Csub = 0; for (int a = aBegin, b = bBegin; a <= aEnd; a += aStep, b += bStep){ __shared__ float As[BLOCK_SIZE][BLOCK_SIZE]; __shared__ float Bs[BLOCK_SIZE][BLOCK_SIZE]; As[ty][tx] = A[a + wA * ty + tx]; Bs[ty][tx] = B[b + wB * ty + tx]; __syncthreads(); for (int k = 0; k < BLOCK_SIZE; ++k){ Csub += As[ty][k] * Bs[k][tx]; } __syncthreads(); } int c = wB * BLOCK_SIZE * by + BLOCK_SIZE * bx; C[c + wB * ty + tx] = Csub; }
  • 19.
    Типичные задачи –map/reduce  Map – реализуется довольно просто  С reduce возникают сложности
  • 20.
    Типичные задачи –Обработка сигналов  Изображения  Аудио  Видео  Фильтрация  Кодирование  Декодированиe
  • 21.
    Типичные задачи –Big Data  Анализ больших данных  Классификация  Кластеризация  Регрессия  Машинное обучение  Алгоритмы требующие обучения  Нейросети Полезные ссылки:  Theano
  • 22.
    Типичные задачи –Трассировка лучей Пример кода: mod = SourceModule(“”” __device__ void distance(float3 point, float3 ray_orig, float3 ray_dir, Scene* scene){ //code } __device__ void calc_color(float3 point, float3 normal, Material* mat, Scene* scene){ //code } __global__ void kernel(…, uchar4 out_imate, int w, int h){ //your code } “””)
  • 23.
    Типичные задачи –Трассировка лучей  VirtualRay
  • 24.
    Типичные задачи –Трассировка лучей
  • 25.
    Типичные задачи –Полный матан  Решение дифуров  Решение задач нелинейной оптимизации  Мой опыт как раз относится к этому
  • 26.
    Мой опыт –Метод сопряженных градиентов
  • 27.
    Мой опыт –Раскладка графа
  • 28.
    Мой опыт –Раскладка графа Количество переменных Количество итераций Время (с) 254 635 3.147 2046 5115 301.11 8190 20475 4640.31 Количество переменных Количество итераций Время (с) Прирост 254 635 1.974 1.59 2046 5115 113.1 2.66 8190 20475 1413.5 3.28 Inel Core i5, OpenMP GeForce 650 GTX, CUDA
  • 29.
    Средства отладки ипрофилирования  Nsight  Visual profiler Полезные ссылки:  Руководство пользователя Visual Profiler
  • 30.
    Средства отладки ипрофилирования
  • 31.
    Мотивация для использования Утилизация (абсолютно) всех ресурсов компьютера  Чтобы не усложнять процесс, есть оптимизированные библиотеки  GPUArrays (вместо CUBLAS)  CURAND  …
  • 32.
    За здравствует код! Местодля Ваших вопросов