
- •Курс лекций
- •Оглавление
- •1. Архитектура и принципы работы обычных эвм с центральным процессором (cpu) 9
- •2. Методы повышения производительности традиционных эвм 27
- •3. Типы архитектур высокопроизводительных вычислительных систем 45
- •4. Потоковые параллельные вычисления для физического моделирования 62
- •5. Применение графических процессоров на примерах сложения матриц и решения дифференциальных уравнений 82
- •6. Молекулярная динамика на графическом процессоре 100
- •7. Высокоскоростное моделирование систем с дальнодействием 125
- •8. Восстановление потенциалов межчастичных взаимодействий по температурной зависимости периода решетки методами высокоскоростного мдм на графических процессорах 145
- •9. Базовые особенности программирования графических процессоров шейдерной модели 4.0 160
- •Введение
- •1.Архитектура и принципы работы обычных эвм с центральным процессором (cpu)
- •1.1.Структура традиционной эвм
- •1.2.Организация работы эвм
- •1.3.Иерархия памяти компьютера
- •1.4. Выполнение команд
- •1.5.Требования к коммуникационным линиям
- •1.6.Устройства ввода-вывода
- •2.Методы повышения производительности традиционных эвм
- •2.1. Распараллеливание расчетов
- •2.2.Конвейерная обработка данных и команд
- •2.3.Высокопроизводительные процессоры
- •2.3.1.Суперскалярные процессоры
- •2.3.2.Процессоры risc с сокращенным набором команд
- •2.3.3.Процессоры со сверхдлинным командным словом
- •2.3.4.Векторные процессоры
- •2.3.5.Процессоры для параллельных компьютеров
- •2.3.6.Процессоры с многопоточной архитектурой
- •2.3.7.Технология Hyper-Threading
- •2.4.Требования к памяти высокопроизводительных эвм
- •2.5.Коммуникационная сеть высокопроизводительных эвм
- •2.5.1.Статические и динамические топологии и маршрутизация коммуникационных систем
- •2.5.2.Многокаскадные сети и методы коммутации
- •2.6.Классификация архитектур параллельных компьютеров
- •3.Типы архитектур высокопроизводительных вычислительных систем
- •3.1.Simd архитектура (с разделяемой и распределенной памятью)
- •3.2. Mimd архитектура с разделяемой и распределенной памятью
- •3.3. Комбинированные системы
- •3.4. Мультипроцессорные и мультикомпьютерные системы
- •3.5.Кластеры пэвм и рабочих станций
- •3.6.Особенности параллельного программирования
- •4.Потоковые параллельные вычисления для физического моделирования
- •4.1.Общие принципы распараллеливания расчётов
- •4.2.Обмен данными между процессором и памятью
- •4.3.Графические процессоры как вычислительные системы для поточно-параллельных расчётов
- •4.3.1.Вычислительные возможности центральных процессоров общего назначения и графических процессоров
- •4.3.2.Графический конвейер
- •4.3.3.История программируемости графических процессоров
- •4.3.4.Требования к алгоритмам для gpu, поддерживающих шейдерную модель 3.0
- •4.3.5.Возможности gpu в рамках шейдерной модели 3.0 и взаимодействие gpu с памятью
- •4.3.6.Проблема одинарной точности
- •4.4.Средства программирования графических процессоров
- •4.4.1.Общая структура программы для физического моделирования на графическом процессоре
- •4.4.2.Необходимое программное обеспечение
- •4.5.Области использования графических процессоров
- •5.Применение графических процессоров на примерах сложения матриц и решения дифференциальных уравнений
- •5.1.Распараллеливание независимых вычислений
- •5.2.Используемый графический процессор
- •5.3.Представление данных для графического процессора
- •5.4.Программирование вычислительного ядра
- •5.5.Взаимодействие центрального и графического процессоров
- •5.5.1.Функции центрального процессора
- •5.5.2.Пример программы
- •6.Молекулярная динамика на графическом процессоре
- •6.1.Принципы моделирования ионных кристаллов методом молекулярной динамики
- •6.2.Программирование графического процессора для расчёта действующих на ионы результирующих сил
- •6.2.1.Исходные данные
- •6.2.2.Представление исходных данных для gpu
- •6.2.3.Алгоритм расчёта результирующих сил с использованием графического процессора
- •6.2.4.Шейдер для расчёта результирующей силы
- •6.3.Исполнение шейдера из программы мд-моделирования на c#
- •6.3.1.Этапы алгоритма моделирования, исполняемые на cpu
- •6.3.2.Процедуры на c#, обеспечивающие работу с графическим процессором
- •6.4.Постановка граничных условий и стабилизация макросостояния молекулярно-динамической системы
- •6.4.1.Компенсация импульса и момента импульса
- •6.4.2.Стабилизация температуры
- •7.Высокоскоростное моделирование систем с дальнодействием
- •7.1.Актуальность моделирования
- •7.2.Высокоскоростные алгоритмы моделирования систем с дальнодействующими силами
- •7.3.Методика высокоскоростного молекулярно-динамического моделирования диоксида урана
- •7.4.Экспериментальные результаты и их обсуждение
- •7.5.Анализ зависимостей среднего квадрата смещений ионов кислорода от времени
- •8.Восстановление потенциалов межчастичных взаимодействий по температурной зависимости периода решетки методами высокоскоростного мдм на графических процессорах
- •8.1.Задача восстановления потенциалов межчастичных взаимодействий в кристаллах
- •8.2.Исходные данные и метод восстановления потенциалов
- •8.3.Модель и детали реализации
- •9.Базовые особенности программирования графических процессоров шейдерной модели 4.0
- •9.1.Предпосылки появления новой шейдерной модели
- •9.2.Архитектура gpu шейдерной модели 4.0. Преимущества этой модели
- •9.2.1.Иерархия вычислительных блоков и памяти в шейдерной модели 4.0
- •9.2.2.Конвейерная обработка данных на gpu sm4
- •9.2.3.Логическая структура вычислений на gpu sm4
- •9.2.4.Преимущества gpu шейдерной модели 4.0
- •9.3.Средства высокоуровневого программирования gpu шейдерной модели 4.0
- •9.3.1.Совместимость с шейдерной моделью 3.0
- •9.3.2.Специальные средства программирования gpu sm4. Cuda
- •9.3.3.Средства для написания и компиляции программ на cuda
- •9.3.4.Структура программы на cuda
- •9.4.Перемножение матриц на cuda
- •9.4.1.Алгоритм перемножения матриц
- •9.4.2.Процедура перемножения матриц на gpu sm4
- •9.4.3.Вызов процедуры перемножения матриц из программы на c
- •9.5.Молекулярная динамика на cuda
- •9.5.1.Алгоритм с использованием разделяемой памяти
- •9.5.2.Расчёт сил на gpu с использованием 3-го закона Ньютона
- •Библиографический список
- •Приложение 1 Операторы и функции языка hlsl, использованные в курсе лекций п.1.2. Типы данных
5.4.Программирование вычислительного ядра
Всю совокупность операций, которые мы хотим применить к данным из входных массивов графического процессора в рамках одной программы, называют вычислительным ядром. Это название отражает тот факт, что вычислительное ядро не включает в себя вспомогательные операции, такие как операции управления циклами (поскольку вместо них осуществляется параллельная поточная обработка всех входных данных) или операции по подготовке данных, (которые необходимы, но исполняются центральным процессором вне GPU). Таким образом, программирование графического процессора заключается в реализации вычислительного ядра в виде шейдера.
Как уже обсуждалось, мы рассматриваем программирование графических процессоров 3-его поколения, называемых так потому, что в них реализована шейдерная модель 3-й версии (SM 3.0). В этой модели существует 2 типа шейдеров: пиксельные и вершинные. Для ресурсоемкого физического моделирования на GPU лучше использовать пиксельные шейдеры, поскольку соотношение соответствующих, пиксельных и вершинных, процессоров на GPU поколения SM 3.0 варьируется от 3:1 до 6:1.
Для написания шейдеров мы использовали язык высокого уровня HLSL, компилятор которого входит в DirectX и XNA (эти библиотеки процедур будут подробнее рассмотрены ниже). В DirectX и XNA шейдеры задаются в виде файлов, называемых эффектами. Эффект содержит одну или несколько техник (процедур), которые в свою очередь могут состоять из одного или нескольких проходов, а каждый проход включает в себя вызов функций вершинного и пиксельного шейдеров.
Рассмотрим подробно написание конкретного эффекта, на простом примере сложения двух матриц. Математическая задача имеет вид :
,
а вычислительное ядро здесь –
.
Ниже мы приводим текст программы на HLSL, складывающей матрицы, с комментариями. Отметим то, что синтаксис языка HLSL (см. Приложение 1) близок к синтаксису языка Си.
Блок описания входных данных. Первая строка шейдера описывает объекты tex_matrix1 и tex_matrix2 типа texture (текстура). Эти объекты представляют собой массивы входных данных, т.е., содержат значения aij и bij:
texture tex_matrix1, tex_matrix2;
Описание «избирателей». Для работы с текстурами в шейдере необходимо описать (и затем запустить в работу) избиратели (samplers) - процедуры, которые будут передавать входные данные из видеопамяти на графические конвейеры для обработки. Тексты этих процедур писать не нужно, поскольку они встроены в графический процессор, но описание требуется, поскольку для каждой из входных текстур избиратель имеет своё название и свои значения параметров, которые определяют способ адресации, интерполяции значений и другое. Мы оставляем настройки избирателей по умолчанию: кусочно-постоянная интерполяция (Point) и периодическая адресация при выходе за границы (Wrap). В нашей программе строки
sampler matrix1 = sampler_state { Texture = <tex_matrix1>; };
sampler matrix2 = sampler_state { Texture = <tex_matrix2>; };
описывают sampler’ы matrix1 и matrix2 для текстур tex_matrix1 и tex_matrix2, соответственно.
Вершинный шейдер. Процедур, реализующих пиксельные и вершинные шейдеры, в файле может быть несколько, но в каждый момент исполнения эффекта активными могут быть только один вершинный и один пиксельный шейдер. В принципе, шейдеры имеют ту же структуру, что и процедуры на языке Си:
void transform(in float4 pos_in: POSITION, in float2 tex_in: TEXCOORD0, out float4 pos_out: POSITION, out float2 tex_out: TEXCOORD0)
{
tex_out = tex_in;
pos_out = pos_in;
}
Приведённый текст описывает процедуру transform, которую мы будем использовать в качестве вершинного шейдера. Вершинный шейдер – преобразование координат из трехмерного пространства вершин в пространство рендер-цели (прямоугольник на плоскости, рис. 4.1). Мы не задействуем вершинный шейдер в расчёте, поэтому сводим преобразование вершин к простому копированию. Для этого мы сразу задаём координаты вершин лежащими в плоскости прямоугольника рендер-цели (подробности приведены в следующем разделе).
Входные параметры процедуры – переменная одинарной точности (float4) pos_in, характеризующая начальную позицию обрабатываемой вершины (POSITION) и переменная “половинной” точности (float2) tex_in, являющаяся координатой входной текстуры (TEXCOORD0). Выходные параметры – соответствующие преобразованные значения pos_out и tex_out тех же типов.
Пиксельный шейдер. В нашем примере имеет вид
float4 sum(float2 uv : TEXCOORD0) : COLOR
{
return tex2D(matrix1, uv) + tex2D(matrix2, uv);
}
Этот шейдер реализован в виде функции sum, которая возвращает вектор из 4 чисел одинарной точности (float4). В данной задаче нам фактически нужны только первые компоненты этого вектора, хранящие нужный результат суммирования очередных двух чисел из входных массивов. Результат описан как принадлежащий классу COLOR, поскольку в традиционных для GPU задачах определяет цвет пикселя на экране.
Оператор return возвращает сумму чисел aij и bij, расположенных в текстурах tex_matrix1 и tex_matrix2, которые берутся с помощью самплеров matrix1 и matrix2 из ячеек с координатами uv.
Функция sum будет автоматически, в параллельном режиме, исполнена для всех элементов складываемых матриц aij и bij. Каждой паре индексов ij соответствует своё значение параметра функции uv.
Параметр функции uv типа float2 – это вектор на плоскости (пара чисел), указывающий координаты (x,y) очередных двух чисел. Он представляет собой текстурные координаты (TEXCOORD0), т.е. координаты тех двух чисел (aij, bij) во входных матрицах (текстурах) tex_matrix1 и tex_matrix2 которые нужно сложить. Функции tex2D(matrix1, uv) и tex2D(matrix2, uv) берут элементы из текстур tex_matrix1 и tex_matrix2 по адресу uv, используя sampler’ы matrix1 и matrix2. Эти sampler’ы уже были связаны с текстурами tex_matrix1 и tex_matrix2 выше.
Отметим ещё раз, что в файле эффекта может быть описано несколько вершинных и пиксельных шейдеров. Поэтому должны быть описаны также дополнительные процедуры, – техники (technique), - которые запускают по одному вершинному и пиксельному шейдеру для осуществления конкретного этапа расчётов. В нашем примере нужна только одна техника:
//Декларация для внешних вызовов и параметры обработки
technique sum { pass sum {
ZEnable = false;
CullMode = none;
PixelShader = compile ps_3_0 sum();
VertexShader = compile vs_3_0 transform();
} }
Здесь слова pass sum означают, что данная процедура будет запускаться внешними по отношению к откомпилированному эффекту программами (см. ниже) под именем sum.
В примере видно, что в рамках техники можно задать значения некоторых параметров, определяющих режим работы графического процессора. В частности, строка ZEnable = false означает, что будет отключён Z-буфер, а строка CullMode = none – что отключается режим отсечения невидимых элементов изображения (потому что нам для расчётов они тоже нужны). Этот режим используется во всех наших программах физического моделирования.
Наконец, последние две строки запускают рассмотренные выше процедуры sum() и transform() в качестве пиксельного и вершинного шейдеров.
Текст эффекта должен храниться на каком-либо носителе информации (например, на жёстком диске компьютера) в виде текстового файла (например, sum.fx, .fx – традиционное расширение для файлов с эффектами).
Операторы и функции использованные в программе, дополнительно прокомментированы в прил. 1.