SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
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
 …
За здравствует код!
Место для Ваших вопросов

Contenu connexe

Tendances

Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Mikhail Kurnosov
 

Tendances (20)

Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Progr labrab-4-2013-c++
Progr labrab-4-2013-c++Progr labrab-4-2013-c++
Progr labrab-4-2013-c++
 
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
 
Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение"
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложений
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NET
 
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон КорзуновПравильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
 
Кастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриКастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутри
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Что API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновЧто API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон Корзунов
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
Лекция №9 "Алгоритмические композиции. Начало"
Лекция №9 "Алгоритмические композиции. Начало"Лекция №9 "Алгоритмические композиции. Начало"
Лекция №9 "Алгоритмические композиции. Начало"
 
L10: Алгоритмы кластеризации
L10: Алгоритмы кластеризацииL10: Алгоритмы кластеризации
L10: Алгоритмы кластеризации
 
ITMO RecSys course. Autumn 2014. Lecture 4
ITMO RecSys course. Autumn 2014. Lecture 4ITMO RecSys course. Autumn 2014. Lecture 4
ITMO RecSys course. Autumn 2014. Lecture 4
 
8.b proizvodnye
8.b proizvodnye8.b proizvodnye
8.b proizvodnye
 
Поговорим про арифметику
Поговорим про арифметикуПоговорим про арифметику
Поговорим про арифметику
 

Similaire à Python + GPGPU

20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Mikhail Kurnosov
 

Similaire à Python + GPGPU (20)

20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
directx
directxdirectx
directx
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
OpenACC short review
OpenACC short reviewOpenACC short review
OpenACC short review
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
C++0x
C++0xC++0x
C++0x
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPU
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркинга
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”
 

Plus de PyNSK

Plus de PyNSK (20)

Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1
 
Asyncio для процессинга распределенной базы данных
Asyncio для процессинга  распределенной базы данныхAsyncio для процессинга  распределенной базы данных
Asyncio для процессинга распределенной базы данных
 
Python для GameDev
Python для GameDevPython для GameDev
Python для GameDev
 
Python инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестированияPython инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестирования
 
Python, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системыPython, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системы
 
Настрой контент под пользователя!
Настрой контент под пользователя!Настрой контент под пользователя!
Настрой контент под пользователя!
 
Питон в малине
Питон в малинеПитон в малине
Питон в малине
 
Мой Python всегда со мной!
Мой Python всегда со мной!Мой Python всегда со мной!
Мой Python всегда со мной!
 
Как и зачем можно создать DSL на Python
Как и зачем можно создать DSL на PythonКак и зачем можно создать DSL на Python
Как и зачем можно создать DSL на Python
 
Чем Python плох для стартапа?
Чем Python плох для стартапа?Чем Python плох для стартапа?
Чем Python плох для стартапа?
 
Во внутренности Kivy
Во внутренности KivyВо внутренности Kivy
Во внутренности Kivy
 
Зоопарк python веб-фреймворков
Зоопарк python веб-фреймворковЗоопарк python веб-фреймворков
Зоопарк python веб-фреймворков
 
Как Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикойКак Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикой
 
Применение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовПрименение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектов
 
Ctypes в игровых приложениях на python
Ctypes в игровых приложениях на pythonCtypes в игровых приложениях на python
Ctypes в игровых приложениях на python
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Python инструменты решения типичных задач
Python  инструменты решения типичных задачPython  инструменты решения типичных задач
Python инструменты решения типичных задач
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобен
 
TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.
 

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 + Примеры $pip install pycuda Полезные ссылки:  Wiki по установке PyCUDA  Неофициальные сборки PyCUDA
  • 10. 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))
  • 11. 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))
  • 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. За здравствует код! Место для Ваших вопросов