+ All Categories
Home > Software > Python + GPGPU

Python + GPGPU

Date post: 14-Apr-2017
Category:
Upload: pynsk
View: 352 times
Download: 3 times
Share this document with a friend
32
Python + GPGPU Ожидания и реалии Докладчик: Евгений Петренко
Transcript

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

За здравствует код!

Место для Ваших вопросов


Recommended