Хорошо известно [2, 3], что одним из ключевых вопросов при ис-
пользовании графических процессоров является правильная органи-
зация работы с разными типами памяти. Важной особенностью гра-
фического адаптера является наличие трех видов памяти: локальной
(local), связанной с конкретным потоковым процессором; разделяемой
(shared) памяти, доступной в рамках мультипроцессора; глобальной
(VRAM) — определенной для видеоадаптера в целом.
Локальная память доступна только потоку, который выполняется
на данном вычислителе. Разделяемая память доступна всем потокам
блока, а глобальная память доступна всем потокам во всех блоках
решетки. Области глобальной памяти могут быть выделены или осво-
бождены только с хоста, т.е. только между вызовами ядер.
Глобальная память, при всем ее удобстве, не кэшируется и является
относительно медленной по сравнению с разделяемой памятью. Во-
обще говоря, использование в процессе решения задачи разделяемой
памяти вместо глобальной позволяет добиться значительного увеличе-
ния эффективности использования графических процессоров. Особен-
ности использования указанных видов памяти рассмотрены подробно
в [2–4].
Особенности разработки приложений для CUDA.
CUDA-прило-
жения фактически являются многопоточными приложениями. Однако
в силу специфики потоков, а именно большого их числа и крайней лег-
ковесности, программирование CUDA-приложений значительно отли-
чается от программирования обычных многопоточных приложений.
Одна особенность состоит в том, что поскольку для задач, под
которые изначально создавались современные видеоадаптеры, харак-
терна практически абсолютная декомпозиция данных (т.е. для парал-
лельно обрабатываемых данных результаты обработки одной их части
не зависят от результатов обработки другой), в CUDA-приложениях
практически отсутствуют методы контроля конкурентного доступа к
данным.
Другая особенность также обусловлена архитектурой аппаратных
средств, нацеленных на задачи обработки графики, в которых алгорит-
мы линейны и не содержат условных переходов, т.е. условные перехо-
ды не поддерживаются аппаратной частью вовсе. При этом условные
переходы и циклы, хотя и поддерживаются программными средства-
ми CUDA, тем не менее являются самыми “тяжелыми” операциями
для GPU, поэтому при написании приложений следует старательно их
избегать.
Еще одна особенность связана с использованием различных видов
памяти. При разработке CUDA-приложений для управления и оптими-
зации доступны два вида памяти графического адаптера: глобальная
74
ISSN 1812-3368. Вестник МГТУ им. Н.Э. Баумана. Сер. “Естественные науки”. 2011. № 3