В ноябре оказалось слишком много работы, поэтому была прочитана только одна книжка на компьютерные темы.
Programming Massively Parallel Processors: A Hands-on Approach
В рамках проверки некоторых гипотез решил ознакомиться с программированием для графических процессоров (GPU). В общих чертах я знал как это делается, а для получения более подробной информации выбрал книжку
Programming Massively Parallel Processors: A Hands-on Approach, которая судя по обзорам должна была дать достаточно информации для начала работы с GPU.
Первые две главы содержат введение в историю программирования на GPU, рассматривают их архитектуру, а также описывают разные подходы к параллельному программированию.
Начиная с третье главы начинается описание программирования с помощью CUDA, начиная со структуры программы. Затем показывается простой пример умножения двух матриц, который будет улучшаться на протяжении всей книги. И в заключение третьей главы, рассматриваются необходимые вопросы перемещения данных между основной памятью и GPU, а также то, как соотносятся ядерные функции и потоки выполнения GPU.
Четвертая глава полностью посвящена тому, как организовано выполнение кода в модели CUDA — как потоки выполнения выбираются для исполнения на процессоре, как они образуют блоки потоков, как обеспечить синхронизацию между потоками. В пятой главе рассматриваются все виды памяти доступной для программиста CUDA и описываются различные стратегии ее использования, с учетом влияния на производительность и т.п. вещи.
Шестая глава полностью посвящена вопросам оптимизации производительности программ — как обеспечить полную загрузку процессора и шины по которой данные передаются в память, как организовать предвосхищающую выборку данных, и т.д. В седьмой главе внимание читателя обращается на выполнение операций с плавающей точкой, о том, как это влияет на точность вычислений и т.п. вопросам.
В 8-й и 9-й главах рассматриваются два проекта, которые используют вычисления на GPU. Для каждого проекта рассматриваются архитектура программы, как организованы данные, что выносится в ядерную функцию и т.п.
Десятая глава более философская — в ней пытаются описать общие подходы к решению проблем и выбору алгоритмов для параллельных программ.
А 11-я глава посвящена небольшому описанию языка OpenCL, с указанием отличий его от CUDA. Но описание слишком краткое, и лучше обратиться к официальной документации по
OpenCL, хотя сама книга дает очень теоретическую хорошую базу.
Заключение: Если вы хотите ознакомиться с основами "нормального (general purpose)" программирования на графических процессорах, то вы можете взять эту книгу. В ней содержится общая информация об архитектуре, советы по дизайну эффективных программ, которые будут работать на этих процессорах (проиллюстрированные различными примерами), а также небольшое введение в OpenCL. Кроме того, каждая глава книги содержит много ссылок на статьи и литературу, которые могут быть полезны в дальнейшей работе. Для тех кто хочет подробней познакомиться с CUDA, советуют книгу
CUDA by Example: An Introduction to General-Purpose GPU Programming и/или официальную документацию.
Дальнейшая работа
Меня в первую очередь интересует
OpenCL, поскольку имеется возможность его использования из других языков, а не быть привязанным к C. Например, имеется проект
Calx, который обеспечивает возможность запуска кода на OpenCL из программ на Clojure. К тому же, OpenCL поддерживается не только NVidia. Я жду выхода в следующем году книг
OpenCL in Action (уже можно начинать читать купив MEAP) и
OpenCL Programming Guide, которая, судя по описанию, должна содержать достаточно много полезной информации.
Хорошим подспорьем также является то, что с
недавнего времени вы можете запускать свой код использующий GPU в Amazon Elastic Cloud, что позволяет уменьшить расходы на покупку мощного оборудования.
Дополнительные ресурсы
В качестве полезных ресурсов могу указать на сайт
GPGPU где регулярно публикуются статьи и анонсы про программирование GPU. Например, для меня были интересны следующие статьи:
GrAVity: A Massively Parallel Antivirus Engine и
Regular Expression Matching on Graphics Hardware for Intrusion Detection, поскольку они имеют некоторое отношение к тому, чем я занимаюсь.
Как минимум два курса по программированию GPU можно найти на iTunesU. Кроме того, доступен
следующий курс лекций.
И достаточно много документации и учебных материалов можно найти на сайте
NVidia — как по CUDA, так и по OpenCL.