Технология вычислений общего назначения на графическом ускорителе. Лыков Кирилл Олегович [email protected] Содержание 1.Введение. 1.1 Преимущества GPGPU. 1.2 Программируемость и гибкость 1.3 Сложности и Ограничения 2.Архитектура графического ускорителя 2.1 Конвейер GPU. 2.2 Введение в модель программирования на GPU. 2.3 Модель памяти GPU. 2.4 Контроль потоков на GPU. 3. Система программирования для GPU. 3.1 Языки программирования шейдеров высокого уровня. 3.2 Средства отладки. 3.3 Профилировщики. 4. Технология GPGPU. 5. Применение. 6. Заключение. 7. Приложение: Глоссарий. 8. Литература Прим.: Сам реферат его обновления и другая литература код и прочее может быть найдено на блоге моего курсового проекта http://code.google.com/p/gpgpubitset/ 1. Ведение Развитие современных графических ускорителей или graphic processor unit (в дальнейшем GPU) привело к появлению графических ускорителей с программируемым конвейером. Если раньше программист графических приложений мог использовать только фиксированную функциональность GPU, то теперь 2 стадии обработки информации в конвейере GPU стали программируемыми. Более точно, программируемой стала обработка вершин, что позволило создавать, в частности, более разнообразные модели освещения, а так же обработка фрагментов. Столь коренное изменение архитектуры GPU привело к возможности использования GPU не только для целей компьютерной графики, но и для задач, которые раннее решались на CPU, таким образом, появилась Технология Вычислений Общего Назначения на Графическом Ускорителе или general purpose computation on graphic processor unit (в дальнейшем просто GPGPU). 1.1 Преимущества GPGPU. Современные GPU обладают высокой скоростью доступа к своей собственной оперативной памяти, которая обычно именуется текстурной памятью и имеют высокую вычислительную мощность. Для примера приведем некоторые числа (см. [2]): Если у Intel 3.0 GHz Pentium 4 пиковая вычислительная мощность оценивается как 12 GFLOPs, то у видеокарты ATI Radeon X1800XT 120 GFLOPs, для этого же оборудования пиковая скорость обмена данными между процессором и соответствующей памятью составляет соответственно 5.96 GB/s у CPU против 42 GB/s у GPU. Но GPU не только быстры и мощны, но и что важно, их мощности растут очень быстрыми темпами. Так в [3] приводятся следующие данные : годовой рост производительности CPU - 1.4 раза, а для GPU - 1.7 раз для фрагментного процессора и 2.3 раза для вершинного. Figure by Courtesy Ian Buck and John Owens, Stanford University. Если учесть при этом относительно низкую стоимость видеокарт по сравнению с равномощными CPU, то станет понятно, зачем использовать видеокарты для вычислений общего назначения. 1.2 Программируемость и гибкость. Современные языки шейдеров, разработанные с использованием синтаксиса C. позволяют программистам относительно быстро начать писать эффективные программы для графического ускорителя. При этом язык шейдеров является достаточно гибким и удобным средством для разработки в том числе и сложных вычислительных подпрограмм, к тому же многие математические функции реализованы на GPU аппаратно, что добавляет быстродействия вычислительным программам. 1.3 Сложности и Ограничения. Причина вычислительной мощности GPU в специализированной под графические приложения высоко параллельной архитектуре. Но это вызывает определенные неудобства при использовании GPU для нетрадиционных задач – сохраняются многие термины и некоторый синтаксис, который может показаться программистам, не связанным с компьютерной графикой, несколько искусственным. Ввиду специфичности архитектуры GPU (потоковая модель, а не фон Неймана, как на CPU), программирование GPU оказывается сложным для многих разработчиков. Так же сама многопроцессорная архитектура, сама по себе, уже несет достаточно весомые ограничения на эффективную реализацию многих классов задач. Поэтому, говоря о применимости GPGPU для задачи, как правило, имеется ввиду возможность распараллелить задачу на почти произвольное количество процессоров (их число всегда стапень двойки), например, современные GPU имеют до 24 фрагментных процессора. Существенные ограничения накладывают такие аспекты, как наличие аппаратной поддержки только одинарной точности для чисел с плавающей точкой. На последних моделях и на профессиональных видеокартах аппаратно поддерживаются и целые числа, но пока распространенность такого оборудования не велика. 2. Архитектура GPU. 2.1 Конвейер GPU. Архитектура GPU сформировалась благодаря специфическим потребностям компьютерной графики. Именно это определило высокий параллелизм архитектуры и ее специфику, благодаря чему GPU выполняют поставленные перед ними задачи гораздо эффективнее, чем классические процессоры. Порядок исполнения операций на всех современных GPU может быть представлен конвейером (graphic pipeline), который устроен таким образом, чтобы обеспечить максимальную эффективность выполнения задач компьютерной графики при условии потоковой параллельной архитектуры. На вход подается набор вершин, поступающий из приложения затем вершины обрабатываются в вершинных процессорах классифицируемых как MIMD, программа для вершинных процессоров называется вершинным шейдером. После этого результат работы вершинного шейдера поступает на сборку примитивов, таких как полигоны или линии, далее следует тесты видимости отсечения и прочие стандартные операции компьютерной графики, после них данные поступают на растеризацию. Здесь объемное изображение проецируется на плоский экран, и полученная картинка масштабируется в соответствии-с параметрами окна приложения. Результатом этой операции является некоторое двумерное изображение, те текстура представляющая из себя прямоугольный массив пикселей. Пиксель может быть представлен 1-4 числами. Например в формате RGBA (red, green, blue, alpha) 4мя числами. Эта текстура обрабатывается в пиксельных процессорах, которые по классификации многопроцессорных систем, могут быть классифицированы как SIMD. Затем следует еще несколько операций, данные поступают в буфер кадра, который является тем изображением, которое пользователь видит на экране. Ниже приведена схема этого конвейера, конечно, данное здесь описание не претендует на полноту, но для целей GPGPU этого вполне достаточно. И вершинные и фрагментные процессоры имеют доступ к общей тектстурной памяти. Figure by [4.]. Excerpted from GPU Gems 2 Copyright 2005 by NVIDIA Corporation. 2.2 Введение в модель программирования на GPU. Как уже говорилось, GPU построена по принципу потоковой модели вычислений. Я опишу то как, эта модель представлена на GPU, что позволит излагать материал без излишней теоретизированности. Замечу, что в силу своего устройства фрагментный процессор больше подходит для целей GPGPU, чем вершинный, так же фрагментных процессоров, как правило, в несколько раз больше чем вершинных. Большинство программ использующих технологию gpgpu написаны именно под фрагментные процессоры. Опишу основные этапы разработки программы, использующей описываемую технологию: 1. Разработчик определяет модель параллелизуемых процессов. Он разрабатывает вычислительное ядро программы, те ту часть программного кода, которая выполняет основные вычисления, именно эта часть и пишется непосредственно для видеокарты, для чего используется язык шейдеров. Каждое вычислительное ядро представляет собой набор команд языка шейдеров, причем каждое ядро работает независимо от другого. На вход шейдера поступают такие данные, как текстуры (только на чтение), скаляры, массивы чисел. На выход подается один тексел (максимум 4 float числа ) и глубина ( 1 float число ). Результат работы каждого ядра не может быть использован другим ядром. Другими словами, данные текстуры на выходе образуют потоки, параллелизм которых обеспечивается ядром, выполняемым на каждом процессоре независимо от другого. 2. После того как ядра и потоки были определены, необходимо задать поток выходных данных. Для этого необходимо сделать несколько необычные для программиста, не связанного с компьютерной графикой, действия. А именно, нарисовать некоторый графический примитив на экран средствами используемого графического API. Для целей gpgpu обычно рисуется четырехугольник величиной с используемое окно, которое лучше назвать просто буфером кадра, т.к. собственно окно в привычном смысле не создается, т.е. на экран ничего не выводится, но выделяется область памяти на GPU, предназначенная для хранения результатов вычислений, эта область является ничем иным, как буфером кадра в привычной терминологии компьютерной графики. Здесь же отмечу, что память на видеокарте не линейно адресуема, но двумерна и, хотя можно использовать одномерные тектуры, а так же трехмерные, все же наиболее быстрая работа обеспечивается именно для двумерных текстур; так же одно- и трехмерные текстуры существенно ограничены по размеру. 3. После того как вами был нарисован примитив, растерайзер разбивает его на фрагменты, причем если четырехугольник размером с окно, то каждому пикселю соответствует единственный фрагмент. 4. Фрагменты поступают в фрагментные процессоры и обрабатываются там фрагментным (он же пиксельный) шейдером. 5. В итоге мы имеем некоторые данные в буфере кадра, которые можно копировать в текстуру, если тектуры не была определена как буфер кадра, что позволяют сделать некоторые расширения API. Далее, данные, хранимые в текстуре, могут быть переданы в оперативную память или поступить на вход шейдера для дальнейших вычислений. 2.3 Модель памяти GPU. Графические процессоры имеют свою собственную иерархию памяти, во многом схожую с применяемой на обычных процессорах, но все же отличную от обычной, т.к. архитектура памяти GPU создавалась из расчета на максимальное ускорение работы алгоритмов компьютерной графики. GPU, так же как CPU, имеет свои собственные регистры и кэш, для ускорения доступа к данным во время вычислений. Помимо этого, GPU имеет свою собственную основную память (текстурную память), поэтому для того, чтобы программист мог выполнять вычисления на GPU, он должен предварительно передать данные из оперативной памяти CPU в память GPU. Эта операция традиционно является достаточно дорогостоящей с точки зрения производительности, ввиду относительно не высокой скорости передачи данных между памятью приложения и памятью видеокарты, хотя современны шины PCI Express и специальные чипы на материнской плате (такие как NV4) заметно ускорили этот процесс. Тут стоит отметить статью [6.], где описаны некоторые интересные особенности передачи и хранения данных на обоих видах памяти и даны рекомендации по ускорению этого процесса. В отличие от памяти CPU память GPU имеет некоторые серьезные ограничения, и доступ к ней может быть осуществлен только посредством некоторых абстракций графического программного интерфейса. Каждая такая абстракция может мыслиться как тип потока со своим собственным набором правил доступа. Таких потоков непосредственно доступных для программиста может быть выделено 4 – потоки вершин, потоки фрагментов, потоки буфера кадров, потоки текстур. За дополнительной информацией можно обратиться к [5.]. 2.4 Контроль потоков на GPU. 3. Система программирования для GPU. Под термином система программирования будем понимать следующую совокупность средств разработки язык программирования высокого уровня, система ля отладки кода, профилировщик. Существует множество языков программирования шейдеров, дебагеров и профилировщиков, но большинство из них не удобны в работе, узконаправленны под конкретный язык шейдеров или даже платформу, а некоторые из них не подходят для целей gpgpu. В итоге мы имеем не так уж много средств для разработки, отладки и оптимизации приложений под GPU. 3.1 Языки программирования шейдеров высокого уровня. Большинство языков шейдеров высокого уровня созданы таким образом, что бы максимально отвечать требованиям компьютерной графики, поэтому, оперируя с массивами или векторами, или просто входными данными, мы употребляем синтаксис с названиями, характерными для компьютерной графики и обработки изображений. Например, доступ к компонентам вектора есть то же, что доступ к компонентам цвета rgba, в некоторых языках шейдеров мы должны явно указывать квалификаторы после входных параметров, например :COLOR0 или что-нибудь в этом роде, т.е. указываем тип регистровой переменной в которой хранятся входные данные для шейдера. Большинство языков шейдеров высоко уровня основаны на синтаксисе С, но с существенными ограничениями и как правило более жесткой типизацией. Наиболее известны языки GLSL ( OpenGL Shading Language ), HLSL ( High Level Shading Language), Cg( C for graphics by NVidia Corp.), они же и используются для gpgpu. Есть так же и другие языки шейдеров например одним из первых языков шейдеров высокого уровня является Render Man. Так же стоит отметить Brook programming language расширяющий стандартный С с использованием потоковой модели вычислений, этот язык был разработан специально для обеспечения вычислений на gpu, но используется не часто ввиду того, что поддерживается не так хорошо как вышеперечисленные языки. Все три вышеперечисленных языка шейдеров поддерживают операции работы с 4х компонентными векторами и матрицами, вектора больших размерностей ан уровне языка не поддерживаются. Вообще процессоры gpu имеют векторную архитектуру для наилучшей работы с пикселями, которые представляют собой вектора с количеством компонент, не превосходящем 4. Так же все они имеют богатый набор встроенных математических функций, таких как sin, cos, tg, ln и прочие. Некоторые из них (тригонометрические), на современных gpu поддерживаются аппаратно. Наиболее популярны у программистов gppgu языки Cg и GLSL ввиду того, что первый активно поддерживается NVidia и имеется много кода написанного на нем, в частности код к книгам GPU Gems, GPU Gems2, которые являются наиболее интересными и содержательными нетривиальными книгами по компьютерной графике вообще. GLSL, поставляемый вместе с OpenGL, является весьма популярным языком у всех разработчиков, использующих данный API. Замечу, что Cg работает как под OpenGL, так и под Direct3D от Microsoft. Ввиду того, что в научном софте Direct3D почти не применяется, gpgpu код написан в основном на Cg или GLSL. Более подробную информацию о различных языках шейдерах и об их развитии вы можете найти в [7.], которая так же была издана на русском языке. Так же эта книга в первую очередь наиболее полный учебник по GLSL. 3.2 Средства отладки. //… 3.3 Профилировщики. //… 4. Техники GPGPU. Не смог найти соответствующих терминов на русском языке, поэтому использую английскую терминологию. 4.1 Map. Самой очевидной операцией gpgpu является так называемый map operation. На вход этой операции подается входной поток данных и функция, map применяет эту функцию к каждому элементу потока. Те происходит то что описывалось в предыдущих разделах. Результат выполнения фрагментного шейдера и есть результат применения этой операции. 4.2 Уменьшение входного потока (reducing). Иногда возникает необходимость получить поток меньшей размерности чем подаваемый на входе, возможно даже одноэлементный поток. Такая техника вычислений называется reducing. Она применяется например при нахождении максимального элемента во входном потоке ил подсчета суммы всех элементов потока. //… 4.3 Scatter and Gather Если запись или чтение из памяти осуществляется косвенно то эти операции именуются Scatter and Gather соответственно. Scatter operation выглядит как обыкновенный код на С : data[i] = v , где v будет храниться в массиве data по индексу i. Gather операция выглядит аналогично : v = data[i]. Реализация последней операции на GPU представляет из себя вариации на тему чтения элементов текстуры. Чтение из текстуры d с использованием вычисленных координат представляющее из себя косвенное чтение из тектуры определяет gather. Представление scatter не столь простое. Дело в том что фрагменты имеют четкое местоположение в буфере кадров, из-за этого нет никакой возможности производить запись по произвольному адресу памяти на GPU. Те scatter не реализованно на GPU. Поэтому программистам приходится прибегать к всевозможным трюкам для реализации scatter: изменение scatter на gather(см .[8.] )маркировка выходных данных фрагментного шейдера, а затем их сортировка в соответствии с маркировкой; использование вершинных шейдеров для обеспечения scatter. 4.4 Фильтрация потока. Многие алгоритмы требуют возможности выбора из потока некторого подмножества данных и отбросу остальных. Фильтрация потока- по существу неоднородная reduction. Эта техника не может быть основана на стандартном механизме reduction, тк размер данных после фильтрации заранее не известени может варьироваться. Horn описал в [9.] технологию назваееую stream compaction которая представляет из себя фильтрацию потоков на GPU. С использованием сканирования и поиска фильтрация потока требует O(logn) операций. 4.5 Сортировка Сортировка является классической задачей программирования и существует множество алгоритмов эффективно ее решающих. Большинство этих алгоритмов требуют scatter и обладают зависимостью от данных эти операции эффективно не реализуются на GPU поэтому нам нужны другие алгоритмы который бы подходили для нашей модели вычислений. Большинство придуманных алгоритмов сортировки для GPU базируются на сортировочных сетях (sorting networks). Основная идея таких сортировок в том что задается конфигурация сети которая сортирует данные за фиксированное количество шагов. Смысл задания сети в том что тогда проблема решается в терминах gather, а значение фиксированности количества шагов для конкретного размера входных данных в том что в таком случае нет необходимости в условных переходах в программе (соответствующие инструкцие имеются они все же являются относительно медленными). Эффективная GPU сортировка требует O(n (log n)(log n)) операций, что больше log n раз чем того требут например быстрая сортировка. Kipfer и Purcell описывают bitonic merge sort и Callele использует periodic balanced sorting network . Детали этих алгоритмов различны, но общая стратегия схожа. Данные хранятся в текстурной памяти. Каждый этап обработки данных реализуется фрагментным шейдером который осуществляет операции сравнения и обмена. Программа просто выбирает два значения тектур и на основании параметров сортировки решает какое из этих значений подать на выходной поток. Существуют так же алгоритмы сортировки использующие стандартную функциональность GPU. Их преимущество в том что опреации фиксированной функциональности gPUыполняются в 1.2 раза быстрее шейдерных операций, а главный недостаток в в том что поддерживается точность только в 16 бит, вместо 32 бит доступных в шейдере. Этот алгоритм реализуется с помощью текстурирования и наложения цветов. На GPU реализованы так же алгоритмы сортировки одномерных и трехмерных последовательностей. //… 4.1.6 Поиск. Бинарная поиск. //… Поиск ближайших соседних //… 4.2 Структуры данных на GPU. 4.2.1 Плотные массивы. Разряженные массивы. Адаптированные структуры. 4.2.4 Неиндексируемые структуры. 4.3 Диффиренциальные уравнения. Задача решения дифференциального уравненения встречается во многих областях начиная от решения физических задач и заканчивая приложениями в медицине. Выделим два класса дифференциальных уравнений обыкновенные и уравнения в частных производных. Первые возникают например при нахождении траектории точек тела на которое воздействуют какие-нибудь силы, те для решения задач механики. Методы решения этих уравнений хорошо известны, например, методы Рунге-Кутта, Эйлера, средней точки и др.. Эти методы относительно просто реализуются на GPU. Kipfer представил реализацию этих алгоритмов на GPU. Для решения уравнений в частных производных используют обычно или метод конечных дифференциалов дибо метод конечных элементов. На GPU реализуются в основном методы второго класса. Большая часть усилий исследователей в этой области сосредоточилась на решении уравнений типа Навье-Стокса. Метод сопряженных градиентов был реализован Bolz и др. и Kruger, Westermann. Метод множественных сеток (multigrid method) – Goodnight и др. простой метод Якоби и итерационный красночерный Гауса-Зейделя – Harris и др.. Решение волнового уравнения на GPU позволило избежать передачи данных из памяти приложения в память видеокарты что ускорило работу приложения. Изображение сгенерировано Kruger и др. 4. 4 Линейная алгебра. Эффективная реализация алгоритмов линейной алгебры – весьма важная задача в силу того что выполнение эти операции яляются критичными для многих численных приложений. С увеличением гибкости и программируемости GPU все больше исследователей занились реализацией основных алгоритмов таких как сложение и умножение матриц векторов решение систем линейных уравнений на GPU в силу архитектуры которой можно было ожидать весомого прироста производительности, что собственно и было подемонстрировано позже. Пользуясь возросшей мощностью GPU в 2003, Hillesland и др. представили численное решение проблемы наименьших квадратов. Bolz и др. представили реализацию матриц и векторов на GPU. Они реализовали так же разряженные матрицы и метод сопряженных градиентов и регулярный многосеточный метод и продемонстрировали эффективность их реализации на примере решения задач сглаживания и уравнений Навье-Стокса. Goodnight представил другую систему которая отличалась более изощренной работой с памятью и закадровыми буферами кадра. Kruger and Westermann реализовали на GPU библиотеку инкапсулирующую значительную часть функциональности BLAS. Библиотека написанна на языке C++ изделана таким образом чтобы ей мог пользоватьчся программист не знакомый ни с компьютерной графикой ни с языками шейдеров ни с чем-то другим столь же специфичным. Подводя итоги могу сказть что производительность GPU при решении задач линейной особенно высока. Для примера приведу данные из [2.]. Здесь saxpy – операция сложения векторов с заданным скаляром, sgemv – умножение матрицы на вектор, sgemm – умножение матриц. 4.5 Запросы данных. 5. Применение gpgpu 5.1 Обработка сгналов и изображений 5.1.1 Сегментация Работающие приложения для сегментации это медицинские изображения. Общая задача в медицинских изображениях это определить трехмерную поверхность вставленную в обьемную картину полученную с помщью технологий Магнитно-Резонансного моделирования изображения (Magnetic Resonance Imaging (MRI) ) или Вычисляемой топографии (Computed Tomograph (CT) Imaging). Полностью автоматизированная сегментация – это нерешенная проблемма обработки изображений. Полуавтоматизированная сегментация позволяет пользователю направлять процесс вычислений по нужному руслу. GPGPU реализация сегментации внесла весомый вклад в эту область увеличив скорость вычислений более чем в 10 раз и связав быстрые вычисления с интерактивным обьемным моделированием. Интерактивная обьемная сегментация и визуализация Магнитно-Резонансных Изображений на GPU. Изображение получено Lefohn и другими. 5.1.2 Компьютерное зрение Fung и др.. Использовал в своей работе реализацию на gpu операций проекций и наложения изображений для системы основанной на данных получаемых с видеокамеры для ослеживания голов. Его реализация была представлена в открытых кодах как библиотека компьютерного зрения OpenVIDIA ( http://openvidia.sourceforge.net/ ). Их реализация на gpu более чем в 4 раза превосходит по скорости работы чем сопоставимые комерческие системы основанные на cpu. 5.1.3 Image Processing 5.1.4 Обработка сигналов Вдохновленные вычислительными мощностями современных gpu несколько групп исследователей разработали реализации на gpu быстрых преобразований фурье или FFT(см [10]). Их реализация оперирует с двухмерными и одномерными входными данными, использует по основанию два прореживание-по-времени приближение (radix-2 decimation-in-time approach) и требует один проход фрагментного шейдера на один этап FFT. Действительные и мнимые компоненты FFT могут храниться в 2х компонентах 4мерного вектора, поэтому FFT может быть легко расспараллелена и за один проход шейдера вычисляться сразу две итерации FFT. Дискретные вейвлетные преобразования используемые в стандарте JPEG2000 были реализованы на gpu группой исследователей из Гонг-Конгского Университета. Их работа включена в опенсорсный JPEG2000 кодек JasPer. 5.1.5 Tone Mapping 5.1.6 Аудио BionicFX разработала коммерческий продукт “Audio Video Exchange” (AVEX) ускоряющий вычисления для аудио используя GPU. 5.1.7 Фреймворк для обработки видео и изображений Core Image and Core Video frameworks от Apple использует GPUдля ускорения операций над видио и изображениями. Опенсорсный фреймворк Jahshaka использует GPU для ускорения работы с видиорядом. 5.2 Глобальное Освещение На заре своего появления GPGPU предполагалось использовать прежде всего для задач улучшения качества графического изображения. Например для решения задач глобального освещения. Расскажем об использования GPGPU для этих задач и для наглядности покажем несколько изображений полученных от разработанных приложений. (a) (b) (c) (d) (a) Ray tracing and photon mapping. (b) Radiosity. (c) Subsurface scattering . (d) Final gather by rasterization . 5.2.1 Трассировка лучей (ray tracing). Трасировка лучей – это технология основанная на имитации взаимодействия света с поверхностями предметов. Цвет каждого пикселя изображения вычисляется с помощью трасировки лучей исходящих … вычисления того какие поверхности персекаются с этими лучами и того как свет взаимодействует с этими поверхностями. Пересечение луча с поверхностью является центральным моментом для многих алгоритмов трасировки лучей Алгоритм трасировки лучей состоит из 3х основных стадий: генерация светового луча, поиск пересечения луча с поверхностью, наложение теней. Воообще, поверхностей на сцене может быть слишком много для того чтобы использовать лобовой подход и проверять каждый луч и кажую поверхность на пересечение, поэтому используются специальные структуры данных позволяющих уменьшить количество обрабатываемых лучей и поверхностей. Наложение теней в общем случае требует создания дополнительных лучей (теневые лучи, отраженные лучи). Уже ранние реализации трасировки лучей на GPU показали что все вышеуказанные операции а так же вспомогательные тектуры и тени могут быть эффективно реализованны на видеокарте. Weiskopf (см.[11.]) реализовал не линейную трасировку лучей которая может использоваться для изображения гравитационных эффектов таких как черные дыры, или прохождение света через среду с различными показателями отражаемости(такие среды могут продуцировать миражи). Его технология базируется на линейной трисировке лучей с кривыми лучами интерполируемыми с помощью нескольких лучевых сегментов (линейная интерполяция). Рисунок из [11.]. Визуализация астрономического сценария с нейтронной звездой(голубая) и значительно менее тяжелой сопровождающей звездой (желтая). 5.2.1 Отображение фотонов (photon mapping). Алгоритм отображения фотонов (PM) сотстоит из двух стадий. Первая стадия сотоит из излучения фотонов из источника света, симуляция пересечения фотонов с поверхностями и наконец хранение фотонов в специальных структурах данных для эффективного поиска во второй стадии. Вторая стадия в алгоритме отображения фотонов это этап отрисовки. Сначала высчитываются видимые поверхности и обычное значение освещенности, часто с использованием трасировки лучей. Затем вычисляется свет в каждой точке поверхности который задействован окружении (косвенно) или через фокусирование отражения или преломления (caustic). Эти вычисления выполняются с использованием запросов к карте фотонов для получения оценок количества энергии которая была полученя от этого источника. Трасировка фотонов во многом похожа на трасировку лучей. Но создание карты фотонов ее индексирование для получения хороших оценок энергии в каждой точке изображения значительно более сложная задача для GPU. Ma и McCool предложили мало затратный алгоритм поиска в карте фотонов использующий хэштаблицы. Их алгоритм не был реализован на GPU тк хэштаблицы плохо представимы на современных GPU. Purcell и др разработал два различных алгоритма для создания карт фотонов и запросов к ним. Рисунок (а) демонстрирует результат их работы. 7. Приложение: Глоссарий. 8. Литература. Эта обзорная статья написана в основном на основании [1.], оттуда взята структура статьи. Что касается модели памяти, в основном информация почерпнута из [5.]. Ссылки на другие источники приводятся в тексте. 1. John D. Owens, David Luebke, Naga Govindaraju, Mark Harris, Jens Kruger, Aaron E. Lefohn, and Timothy J. Purcell. A Survey of General-Purpose Computation on Graphics Hardware. EUROGRAPHICS 2005. 2. MikeHouston. General Purpose Computation on Graphics Processors. 3. David Luebke. General-Purpose Computation on Graphics Hardware. University of Virginia. 4. John Owens. GPU Gems 2. Chaper 29: Streaming Architectures and Technology Trends. University of California, Davis. NVidia corporation. 5. John Owens, Aaron Lefohn, Joe Kniss. GPU Gems 2. Chaper 33: Implementing Efficient Parallel Data Structures on GPUs. University of California, University of Utah. NVidia corporation. 6. Ikrima Elhassan. Technical Brief : Fast Texture Downloads and Readbacks using Pixel Buffer Objects in OpenGL. Nvidia corporation, 2005. 7. Randi J. Rost . OpenGL® Shading Language. Addison Wesley, 2004. 8. BUCK I. GPGPU: General-purpose computation on graphics hardware—GPU computation strategies & tricks. ACM SIGGRAPH Course Notes (Aug. 2004). 9. HORN D. Stream reduction operations for GPGPU applications. In GPU Gems 2, Pharr M., (Ed.). Addison Wesley, Mar. 2005, ch. 36. 10. Thilaka Sumanaweera, Donald Liu.GPU Gems 2. Chaper 48: Medical Image Reconstraction with the FFT. Siemens Medical Solutions USA. Nvidia Corporation. 11. D. Weiskopf, T. Schafhitzel, and T. Ertl. GPU-Based Nonlinear Ray Tracing. Institute of Visualization and Interactive Systems. University of Stuttgart.