Технология CUDA в примерах: введение в программирование графических процессоров

Технология CUDA в примерах: введение в программирование графических процессоров
Автор: Сандерс Дж., Кэндрот Э.
Год: 2013
ISBN: 978-5-94074-889-2
Страниц: 234
Язык: Русский
Формат: PDF
Размер: 13 Мб

Download

CUDA – вычислительная архитектура, разработанная компанией NVIDIA и предназначенная для разработчиков параллельных программ. В сочетании с развитой программной платформой архитектура CUDA позволяет программисту задействовать невероятную мощь графических процессоров для создания высокопроизводительных приложений, включая научные, инженерные и финансовые приложения.
Книга написана двумя старшими членами команды по разработке программной платформы CUDA. Новая технология представлена в ней с точки зрения программиста. Авторы рассматривают все аспекты разработки на CUDA, иллюстрируя изложение работающими примерами. После краткого введения в саму платформу и архитектуру CUDA, а также беглого обзора языка CUDA C, начинается подробное обсуждение различных функциональных возможностей CUDA и связанных с ними компромиссов. Вы узнаете, когда следует использовать то или иное средство и как писать программы, демонстрирующие поистине выдающуюся производительность.
Издание предназначено для программистов, а также будет полезно инженерам, научным работникам и студентам вузов.

+

Глава 8. Интероперабельность с графикой

Поскольку эта книга посвящена вычислениям общего назначения, то мы, как правило, игнорируем тот факт, что GPU содержат и ряд специальных компонентов. Своим успехом GPU обязаны умению решать сложные задачи рендеринга в реальном масштабе времени, позволяя прочим частям системы заниматься другими делами. Но тогда возникает естественный вопрос: можно ли использовать GPU для рендеринга и вычислений общего назначения в одиой и той же программе? Что, если визуализируемое изображение зависит от результатов вычислений? Или если мы хотим применить алгоритмы обработки изображений к визуализированному кадру? Или подвергнуть его статистическому анализу?

К счастью, взаимодействие между вычислениями общего назначения и рендерингом не только возможно, но и легко реализуется теми средствами, о которых вы уже знаете. Приложения на языке CUDA естественно интегрируются с обеими наиболее популярными библиотеками рендеринга в реальном времени: OpenGL и DirectX. В этой главе мы поговорим о том, как это достигается.

Приведенные здесь примеры отличаются от примеров из предыдущих глав. В частности, предполагается, что вы достаточно уверенно владеете другими технологиями. Конкретно: мы включили довольно много кода, в котором используется OpenGL и GLUT, хотя подробно ни о той, ни о другой библиотеке не рассказываем. Есть немало отличных ресурсов для изучения графических API как в сети, так и в печатном виде, но эта тематика далеко выходит за рамки данной книги. Мы лишь хотели показать, как язык CUDA С и включенные в него механизмы позволяют осуществить интеграцию с графическими приложениями. Если вы нс знакомы с OpenGL или DirectX, то вряд ли почерпнете что-то полезное из этой главы, так что можете сразу перейти к следующей.

8.1. О чем эта глава

Прочитав эту главу, вы:

  • узнаете, что такое иитероперабелыюстъ с графикой и зачем она может понадобиться;
  • узнаете, как настроить устройство CUDA для поддержки интероперабельности с графикой:
  • научитесь разделять данные между ядрами CU DA С и подсистемой рендеринга OpenGL.

Вы. возможно, помните обсуждение функции cudaChooseOeviceO в главе 3, но поскольку тогда это был второстепенный вопрос, то мы рассмотрим ее снова. Показанный выше код просит исполняющую среду выбрать любой GPU с уровнем вычислительных возможностей 1.0 или выше. Для этого сначала создается и обнуляется структура cudaOeviceProp, а затем в ней устанавливаются номера старшего и младшего уровней вычислительных возможностей (1 и 0 соответственно). Дта информация передается функции cudaChooseOeviceO, которая просит исполняющую среду выбрать GPU, удовлетворяющий ограничениям, заданным в структуре cudaOeviceProp. В следующей главе мы подробнее обсудим, что такое вычислительные возможности GPU, а пока достаточно будет сказать, что эта характеристика определяет, какие функции GPU поддерживает. Для всех GPIJ с поддержкой CUDA уровень вычислительных возможностей не меньше 1.0, поэтому код, показанный выше, просто выберет произвольное устройство с поддержкой CUDA и вернет его идентификатор в переменной dev. Нет никакой гарантии, что это самый лучший или самый быстрый GPU, как и гарантии того, что при смене версии исполняющей среды CUDA будет выбираться один и тот же GPU.

Если результат процедуры выбора устройства столь ничтожен, то зачем вообще напрягаться – заполнять структуру cudaOeviceProp и вызывать функцию cudaChooseOeviceO для получения идентификатора устройства? Дай незанимались мы раньше этими глупостями, так с чего вдруг теперь? Хорошие вопросы. А дело в том, что идентификатор устройства нужно знать, чтобы сообщить исполняющей среде CUDA. что мы собираемся использовать это устройство для CUDA и OpenGL. Для этого мы вызываем функцию cudaGLSetGLDevice{), передавая ей идентификатор устройства, полученный от cudaChooseDevice():

HANDlE_FRR0R( cudaGLSetGLDevice( dev ) );
Завершив инициализацию исполняющей среды CUDA, мы можем перейти к инициализации драйвера OpenGL, которая производится с помощью функций из библиотеки GL Utility Toolkit (GLUT). Последовательность обращений знакома любому пользователю GLUT: