Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

CUDA Fortran для инженеров и научных работников. Рекомендации по эффективному программированию на языке CUDA Fortran

Покупка
Артикул: 487696.02.99
Доступ онлайн
479 ₽
В корзину
Fortran — один из важнейших языков программирования для высокопроизводительных вычислений, для которого было разработано множество популярных пакетов программ для решения вычислительных задач. Корпорация NVIDIA совместно с The Portland Group (PGI) разработали набор расширений к языку Fortran, которые позволяют использовать технологию CUDA на графических картах NVIDIA для ускорения вычислений. Книга демонстрирует всю мощь и гибкость этого расширенного языка для создания высокопроизводительных вычислений. Не требуя никаких предварительных познаний в области параллельного программирования авторы скрупулезно шаг за шагом раскрывают основы создания высокопроизводительных параллельных приложений, попутно поясняя важные архитектурные детали современного графического процессора — ускорителя вычислений. Издание предназначено для инженеров, научных работников, программистов, в также будет полезно студентам вузов соответствующих специальностей.
Рутш, Г. CUDA Fortran для инженеров и научных работников. Рекомендации по эффективному программированию на языке CUDA Fortran : практическое руководство / Г. Рутш, М. Фатика ; пер. с англ. А. А. Слинкина. - 2-е изд. - Москва : ДМК Пресс, 2023. - 365 с. - ISBN 978-5-89818-540-4. - Текст : электронный. - URL: https://znanium.com/catalog/product/2107217 (дата обращения: 03.06.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Г. Рутш, М. Фатика

CUDA Fortran
для инженеров
и научных работников

Рекомендации по эффективному 
программированию на языке CUDA Fortran
CUDA Fortran 
for Scientists 
and Engineers

Best Practices for Efficient CUDA
Fortran Programming

Gregory Ruetsch and Massimiliano Fatica

NVIDIA Corporation, Santa Clara, CA

AMSTERDAM • BOSTON • HEIDELBERG • LONDON
NEW YORK • OXFORD • PARIS • SAN DIEGO
SAN FRANCISCO • SINGAPORE • SYDNEY • TOKYO
Morgan Kaufmann is an imprint of Elsevier
Москва, 2023

CUDA Fortran 
äëÿ èíæåíåðîâ 
è íàó÷íûõ ðàáîòíèêîâ

Ðåêîìåíäàöèè ïî ýôôåêòèâíîìó 
ïðîãðàììèðîâàíèþ 
íà ÿçûêå CUDA Fortran

Ãðåãîðè Ðóòø, Ìàññèìèëèàíî Ôàòèêà

NNVIDIA Corporation, Санта Клара, Калифорния

2-е издание, электронное
УДК 004.3’144:004.383.5CUDA
ББК 32.973.26-04
Р60

Р60
Рутш, Грегори.
CUDA Fortran для инженеров и научных работников. Рекомендации по эффективному 
программированию на языке CUDA Fortran / Г. Рутш, М. Фатика ; пер. с 
англ. А. А. Слинкина. — 2-е изд., эл. — 1 файл pdf : 365 с. — Москва : ДМК Пресс, 
2023. — Систем. требования: Adobe Reader XI либо Adobe Digital Editions 4.5 ; 
экран 10". — Текст : электронный.

ISBN 978-5-89818-540-4

Fortran — один из важнейших языков программирования для высокопроизводительных 
вычислений, для которого было разработано множество популярных пакетов программ для 
решения вычислительных задач. Корпорация NVIDIA совместно с The Portland Group (PGI) 
разработали набор расширений к языку Fortran, которые позволяют использовать технологию 
CUDA на графических картах NVIDIA для ускорения вычислений.
Книга демонстрирует всю мощь и гибкость этого расширенного языка для создания высокопроизводительных 
вычислений. Не требуя никаких предварительных познаний в области 
параллельного программирования авторы скрупулезно шаг за шагом раскрывают основы создания 
высокопроизводительных параллельных приложений, попутно поясняя важные архитектурные 
детали современного графического процессора — ускорителя вычислений.
Издание предназначено для инженеров, научных работников, программистов, в также будет 
полезно студентам вузов соответствующих специальностей.

УДК 004.3’144:004.383.5CUDA 
ББК 32.973.26-04

Электронное издание на основе печатного издания: CUDA Fortran для инженеров и научных работников. 
Рекомендации по эффективному программированию на языке CUDA Fortran / Г. Рутш, М. Фатика ; пер. с 
англ. А. А. Слинкина. — Москва : ДМК Пресс, 2014. — 364 c. — ISBN 978-5-97060-065-8. — Текст : непосредственный.


Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими 
бы то ни было средствами без  письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все 
равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи 
с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги.

В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами 
защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации.


ISBN 978-5-89818-540-4
©  2014 Gregory Ruetsch/NVIDIA Corporation and 
Massimiliano Fatica/NVIDIA Corporation. Published 
by Elsevier Inc. All rights reserved.
©  Оформление, перевод на русский язык, издание, 
ДМК Пресс, 2014
Программистам на Fortran’е, которые понимают, 
что хорошо, а что плохо.
ОГЛАВЛЕНИЕ

Благодарности ................................................. 10
Предисловие ................................................... 11

ЧАСТЬ I
Программирование на CUDA Fortran .................... 13

Глава 1. Введение ............................................. 14
1.1. Краткая история вычислений на GPU ................................ 14
1.2. Параллельные вычисления ............................................... 16
1.3. Основные идеи ................................................................. 17
1.3.1. Первая программа на CUDA Fortran .......................................18
1.3.2. Обобщение на большие массивы ..........................................22
1.3.3. Многомерные массивы .........................................................25
1.4. Определение возможностей и ограничений 
оборудования с поддержкой CUDA .................................... 27
1.5. Обработка ошибок ............................................................ 38
1.6. Компиляция программы на CUDA Fortran .......................... 39
1.6.1. Раздельная компиляция ........................................................43

Глава 2. Измерение производительности 
и метрики производительности ............................ 48
2.1. Измерение времени выполнения ядра .............................. 48
2.1.1. Синхронизация хоста и устройства и таймеры CPU ...............49
2.1.2. Хронометраж с помощью событий CUDA ...............................50
2.1.3. Командный профилировщик .................................................51
2.1.4. Профилировщик nvprof .........................................................53
2.2. Ядра, производительность которых, ограничена 
вычислениями, пропускной способностью памяти 
и задержкой ....................................................................... 54
2.3. Пропускная способность памяти ....................................... 58
2.3.1. Теоретически максимальная пропускная способность ..........58
2.3.2. Эффективная пропускная способность .................................60
Оглавление

Глава 3. Оптимизация........................................ 63
3.1. Передача данных между хостом и устройством ................. 63
3.1.1. Зафиксированная область памяти ........................................64
3.1.2. Объединение мелких операций передачи в один пакет .........69
3.1.3. Асинхронная передача данных (дополнительная тема)..........72
3.2. Память устройства ............................................................ 83
3.2.1. Объявление данных в коде, выполняемом на устройстве ......85
3.2.2. Объединенный доступ к глобальной памяти ..........................85
3.2.3. Текстурная память .................................................................99
3.2.4. Локальная память................................................................105
3.2.5. Константная память ............................................................108
3.3. Внутрикристалльная память ............................................ 112
3.3.1. L1-кэш.................................................................................112
3.3.2. Регистры .............................................................................113
3.3.3. Разделяемая память ...........................................................115
3.4. Пример оптимизации работы с памятью: 
транспонирование матрицы ............................................ 122
3.4.1. Недогрузка разделов (дополнительная тема) ......................128
3.5. Конфигурация выполнения ............................................. 133
3.5.1. Параллелизм на уровне потоков ..........................................133
3.5.2. Параллелизм на уровне команд...........................................137
3.6. Оптимизация команд ...................................................... 140
3.6.1. Встроенные функции устройства ........................................141
3.6.2. Флаги компилятора .............................................................142
3.6.3. Расходящиеся варпы ..........................................................143
3.7. Директивы генерации ядра из цикла ............................... 144
3.7.1. Редукция в CUF-ядрах .........................................................147
3.7.2. Потоки CUDA в CUF-ядрах ...................................................147
3.7.3. Параллелизм на уровне команд в CUF-ядрах .......................148

Глава 4. Программирование компьютера 
с несколькими GPU ......................................... 150
4.1. Средства CUDA для работы с несколькими GPU .............. 150
4.1.1. Связь между равноправными устройствами ........................152
4.1.2. Прямая передача данных между равноправными 
устройствами ......................................................................157
4.1.3. Транспонирование матрицы с применением 
равноправного доступа .......................................................168
4.2. Программирование нескольких GPU с применением 
библиотеки MPI ................................................................ 177
4.2.1. Сопоставление устройств рангам MPI .................................179
4.2.2. Транспонирование матрицы с применением MPI ................186
4.2.3. Транспонирование матрицы с применением MPI, 
поддерживающей GPU ........................................................188
Оглавление

ЧАСТЬ II
Примеры задач .............................................. 191

Глава 5. Метод Монте-Карло ............................ 192
5.1. Библиотека CURAND ....................................................... 193
5.2. Вычисление π с помощью CUF-ядер ................................ 198
5.2.1. Стандарт IEEE-754 (дополнительная тема) ..........................202
5.3. Вычисление π с помощью ядер редукции ........................ 205
5.3.1. Редукция с атомарными блокировками 
(дополнительная тема) .......................................................211
5.4. Точность суммирования .................................................. 213
5.5. Опционное ценообразование.......................................... 220

Глава 6. Метод конечных разностей ................... 229
6.1. Девятиточечный шаблон конечно-разностной схемы 
для вычисления первой производной .............................. 229
6.1.1. Повторное использование данных и разделяемая 
память ................................................................................231
6.1.2. Ядро производной по x ........................................................232
6.1.3. Производные по y и z ...........................................................237
6.1.4. Неравномерные сетки .........................................................242
6.2. Двумерное уравнение Лапласа ....................................... 246

Глава 7. Приложения быстрого преобразования 
Фурье ........................................................... 254
7.1. Библиотека CUFFT .......................................................... 254
7.2. Спектральное дифференцирование ................................ 263
7.3. Свертка ........................................................................... 267
7.4. Решение уравнения Пуассона ......................................... 276

ЧАСТЬ III
Приложение .................................................. 283

Приложение А. Технические характеристики 
Tesla ............................................................. 284

Приложение B. Управление системой 
и окружением ................................................ 287
B.1. Переменные окружения .................................................. 287
B.1.1. Общие переменные окружения ...........................................287
B.1.2. Командный профилировщик ...............................................288
B.1.3. JIT-компиляция ...................................................................288
Оглавление

B.2. Интерфейс управления системой nvidia-smi ................... 289
B.2.1. Включение и выключение режима ECC................................290
B.2.2. Режим вычислений .............................................................292
B.2.3. Инерционный режим ...........................................................293

Приложение C. Вызов CUDA C из CUDA Fortran ..... 295
C.1. Вызовы библиотеки, написанной на CUDA C ................... 295
C.2. Вызов написанной пользователем функции на CUDA C ... 298

Приложение D. Исходный код ........................... 300
D.1. Текстурная память .......................................................... 300
D.2. Транспонирование матрицы ........................................... 304
D.3. Параллелизм на уровне потоков и команд ...................... 311
D.4. Программирование с использованием нескольких GPU ....315
D.4.1. Транспонирование с применением равноправного 
доступа к памяти .................................................................316
D.4.2. Транспонирование с применением библиотеки MPI 
для передачи данных между хостами ..................................322
D.4.3. Транспонирование с применением библиотеки MPI 
для передачи данных между устройствами .........................327
D.5. Программирование метода конечных разностей ............ 332
D.6. Решение уравнения Пуассона спектральным методом ... 352

Литература.................................................... 357

Предметный указатель .................................... 359
БЛАГОДАРНОСТИ

Работа над этой книгой приносила нам радость и удовлетворение – прежде 
всего, благодаря общению с людьми, которые помогли сделать книгу 
такой, как вы ее видите. Нам помогало – прямо или косвенно – множество 
людей; рискуя позабыть кого-то, мы хотим выразить благодарность 
следующим лицам и коллективам.
Разумеется, никакой книги о CUDA Fortran не было бы без самого 
языка CUDA Fortran, поэтому мы благодарны компании The Portland 
Group (PGI) и особенно Бренту Либэку (Brent Leback) и Майклу Вулфу 
(Michael Wolfe) – за предмет, о котором мы могли писать. Работа с PGI 
над CUDA Fortran стала для нас великолепным жизненным опытом.
Авторы часто задумывались над тем, что расчеты, выполненные в их 
диссертациях, которые занимали много-много часов на тогдашних больших 
векторных ЭВМ, сейчас – при использовании графических процессоров (
GPU) NVIDIA – завершились бы раньше, чем вы успели бы 
выпить чашечку кофе. Мы благодарны сотрудникам NVIDIA, осуществившим 
этот технологический прорыв. Мы также выражаем признательность 
членам команды, разрабатывающей CUDA, – как нынешним, так и 
работающим уже в других местах: Филиппу Куадра (Philip Cuadra), Марку 
Хэргроуву (Mark Hairgrove), Стивену Джонсу (Stephen Jones), Тиму 
Маррею (Tim Murray) и Джоэлю Шерпельцу (Joel Sherpelz) за ответы на 
наши многочисленные вопросы.
Значительная часть материала этой книги – результат совместных усилий 
над оптимизацией приложений. Мы хотим поблагодарить всех, кто 
участвовал в этой работе, в том числе Норберта Джаффа (Norbert Juffa), 
Патрика Легресли (Patrick Legresley), Паулюса Мицикевичуса (Paulius 
Micikevicius) и Эверетт Филлипс (Everett Phillips).
Многие рецензировали рукопись этой книги на разных этапах работы 
над ней, мы благодарны Роберто Гомперцу (Roberto Gomperts), Марку 
Хэррису (Mark Harris), Норберту Джаффа, Бренту Либэку и Эверетт 
Филлипс за их замечания и предложения.
Мы также признательны Яну Баку (Ian Buck), который предоставил 
нам возможность уделить время этому предприятию, и своим семьям, 
мирившимся с тем, что мы работали и дома тоже.
Наконец, мы хотели сказать спасибо всем нашим учителям. Благодаря 
им мы смогли написать эту книгу и надеемся, что она в свою очередь 
поможет другим.
ПРЕДИСЛОВИЕ

Эта книга предназначена научным работникам и инженерам, которые 
занимаются разработкой или сопровождением компьютерных моделей 
и приложений на языке Fortran и хотели бы воспользоваться параллельными 
вычислениями на графических процессорах (GPU) для 
ускорения своего кода. Мы хотели познакомить читателей с основами 
программирования GPU с помощью CUDA Fortran, а также привести 
несколько типичных примеров, показывающих, что разработка кода 
на CUDA Fortran – не самоцель.
Архитектура CUDA разработана компанией NVIDIA, для того 
чтобы GPU можно было применять для вычислений общего вида, не 
требуя от программиста знаний в области компьютерной графики. 
Существует несколько способов доступа к этой архитектуре, в том 
числе из программ на языке C/C++ – с помощью CUDA C – и на языке 
Fortran – с помощью компилятора CUDA Fortran, разработанного 
компанией The Portland Group (PGI). В этой книге рассматривается 
второй подход. Компилятор CUDA Fortran следует отличать от ускорителя 
PGI Accelerator и от интерфейса между архитектурой CUDA 
и OpenACC Fortran, который представляет собой подход к использованию 
GPU на основе директив. CUDA Fortran – это просто аналог 
CUDA C, только на Fortran’е.
Предполагается, что читатель знаком с такими концепциями 
Fortran 90, как модули, производные типы и операции с массивами. 
Для тех, кто работал с прежними версиями Fortran и хотел бы перейти 
на более современные, имеется несколько прекрасных книг (например, 
Metcalf, 2011). В книге используются некоторые возможности, 
появившиеся в версии Fortran 2003, но они подробно объясняются. 
Хотя знакомство с Fortran 90 необходимо, опыт параллельного программирования (
с помощью GPU или иных средств) необязателен. 
Своей привлекательностью модель программирования CUDA отчасти 
обязана простотой, которая позволяет начинающим очень быстро 
получить работающую параллельную программу.
Нередко причиной обращения к CUDA Fortran является желание 
переписать имеющийся, иногда довольно объемный, код на Fortran’е, 
воспользовавшись GPU. Поскольку CUDA – гибридная модель про-
Предисловие

граммирования в том смысле, что позволяет использовать одновременно 
GPU и CPU, то код, исполняемый на CPU, можно переносить 
на GPU постепенно. Компилятор CUDA Fortran используют и те, 
кто переносит приложения на GPU, в основном применяя подход на 
основе директив, принятый в OpenACC, но хотели бы повысить производительность 
немногих критических участков кода, вручную написав 
код на CUDA Fortran. OpenACC и CUDA Fortran могут мирно 
сосуществовать в одной программе.
Книга состоит из двух основных частей. Первая часть – учебное 
пособие по программированию на CUDA Fortran: от основ написания 
кода до некоторых советов по оптимизации. Во вторую часть мы 
включили несколько примеров для демонстрации применения описанных 
в первой части принципов к решению реальных задач.
В книге используются компиляторы PGI версий 13.x, которые 
можно скачать с сайта http://pgroup.com. Хотя все примеры компилируются 
и запускаются в любой поддерживаемой операционной 
системе из различных сред разработки, в книге упоминается только 
компиляция из командной строки, например в Linux или Mac OS X.

Сопроводительный сайт

Дополнительные материалы можно скачать с сайта издательства 

Elsevier 
по 
адресу 
http://store.elsevier.com/product.
jsp?isbn=9780124169708
Часть I

ПРОГРАММИРОВАНИЕ 
НА CUDA FORTRAN
ГЛАВА 1 
Введение

1.1. Краткая история 
вычислений на GPU

Параллельные вычисления в той или иной форме существуют уже 
десятки лет. Поначалу они были вотчиной немногих программистов, 
имевших доступ к большим и дорогим компьютерам. Но теперь все 
круто изменилось. Почти все потребительские настольные ПК и ноутбуки 
оснащены центральными процессорами (CPU) с несколькими 
ядрами. Даже сотовые телефоны и планшеты по большей части 
оборудуются многоядерными процессорами. Основная причина чуть 
ли не повсеместного присутствия нескольких процессорных ядер состоит 
в том, что производители уже не могут повышать производительность 
одноядерных CPU за счет увеличения тактовой частоты. 
Поэтому, начиная примерно с 2005 года, применяется «масштабирование 
по горизонтали», т. е. увеличение количества ядер, а не «масштабирование 
по вертикали» (повышение тактовой частоты). Но хотя 
сейчас производятся CPU, имеющие от двух до нескольких десятков 
ядер, такая степень параллелизма – ничто по сравнению с количеством 
ядер в графическом процессоре (GPU) . Например, NVIDIA Tesla® 
K20X содержит 2688 ядер. С момента своего появления в середине 
1990-х годов GPU отличались массивно-параллельной архитектурой, 
потому что обработка графики – задача, легко поддающаяся распараллеливанию.

На первых порах применение GPU для вычислений общего вида 
(эту технику часто называют GPGPU) было далеко не тривиальным 
занятием. Приходилось использовать API для программирования 
графики, а он накладывал серьезные ограничения на типы алгоритмов, 
допускающих реализацию на GPU. И даже в тех случаях, когда 
реализация была возможна, программирование алгоритма было 
трудным и интуитивно неочевидным делом для научных работников 
Доступ онлайн
479 ₽
В корзину