исследование фазовых переходов, модель изинга

advertisement
Оглавление
Оглавление ..................................................................................................................................... 1
Введение ......................................................................................................................................... 2
Цель диссертационной работы ................................................................................................ 3
Научная новизна ....................................................................................................................... 3
Методы исследования .............................................................................................................. 4
Достоверность результатов ...................................................................................................... 4
Научная и практическая значимость ...................................................................................... 4
На защиту выносятся следующие основные положения: ..................................................... 4
Апробация работы .................................................................................................................... 4
ГЛАВА 1 ......................................................................................................................................... 5
ИССЛЕДОВАНИЕ ФАЗОВЫХ ПЕРЕХОДОВ, МОДЕЛЬ ИЗИНГА ........................................ 5
1.1 Фазовые переходы и критические явления ...................................................................... 5
1.2 Фазовые переходы в магнетиках ....................................................................................... 7
1.4 Аналитическое решение модели Изинга .......................................................................... 9
ГЛАВА 2 Вычисления на видеокартах, модель программирования CUDA .......................... 13
2.1 Видеокарта как многоядерный и многопоточный процессор. ..................................... 13
2.2 Программная модель CUDA ............................................................................................ 15
2.3 Архитектура видеокарты для вычислений на примере Nvidia Tesla ........................... 17
ГЛАВА 3 Разработка алгоритма для численного моделирования на видеокарте, результаты
вычислений. ................................................................................................................................. 19
3.1 Разработка алгоритма для выполнения на видеокарте ................................................. 20
3.2 Алгоритм моделирования. ............................................................................................... 21
3.3 Фазовый переход в двумерной модели Изинга .............................................................. 30
3.4 Сравнение быстродействия CPU и GPU при моделировании фазового перехода в
модели Изинга......................................................................................................................... 32
3.5 Моделирование поведения двумерной модели Изинга в тепловом резервуаре под
действием внешнего магнитного поля. ................................................................................ 33
3.6 Гистерезис в двумерной модели Изинга под действием внешнего магнитного поля.35
Заключение .................................................................................................................................. 39
Список литературы ..................................................................................................................... 40
1
Введение
Каждое вещество может находится в различных фазах. Состояние вещества в
каждой фазе характеризуется определённым набором макроскопических параметров и
определенной микроскопической структурой. При определённых внешних условиях при
изменении макроскопических параметров всякое вещество меняется своё фазовое
состояние. Переход вещества или другой системы от состояния в одной фазе к состоянию
в другой фазе называется фазовым переходом и происходит при определённых
температурах.
Примеры фазовых переходов в различных материалах:
1. Переход парамагнетик — ферромагнетик и наоборот.
2. Переход гелия из нормального состояния в сверхтекучее состояние
3. Переход воды в лёд.
В изучение таких систем особый интерес представляет собой температура
фазового перехода, так как при этой температуре свойства системы меняются скачком[1].
Проблема фазового перехода является одной из актуальных проблем
теоретической физики. Главные задачи, решаемые статистической теорией фазовых
переходов, заключаются в определении причин фазового перехода и определении
параметров вещества при которых осуществляется фазовый переход.
Изучение параметров фазового перехода привлекает к себе внимание в таких
как физика твердого тела, физическая химия, биохимия и биофизика и другие.
Большой интерес представляют фазовые переходы второго рода, связанные с
переменой структуры вещества без обмена энергией с окружающий средой. Описание
фазовых переходов представляет собой сложную математическую задачу из-за сложной
структуры вещества и сложных потенциалов взаимодействия между атомами. В связи с
этим для исследования закономерностей фазовых переходов а также анализа параметров в
физике применяются различные модели, отображающие свойства реальных веществ и
позволяющие провести численное и аналитическое описание исследуемой системы и
таким образом, изучить закономерности фазового переход.
2
Одной из рассматриваемых моделей является модель Изинга для изучения
магнетизма и теории магнитных фазовых переходов. Модель Изинга используется в
данной работе для рассмотрения фазового перехода ферромагнетик — парамагнетик.
Аналитическое описание модели Изинга и фазовых переходов в ней успешно
проведено для случая одномерной модели Изинга, двумерной модели без влияния
внешней среды. Более сложные модели невозможно описать аналитически и поэтому
применяются численные методы для описания фазового перехода. Одним из численных
методов является метод Монте-Карло который дал определённые положительные
результаты для описания фазового перехода в модели Изинга.
Численная симуляция модели Изинга связана с достаточно большими
вычислительными нагрузками на процессоры компьютеров, поэтому в данный момент
развивается
новое
вычислительных
направление
устройств
для
численного
используются
моделирования.
видеокарты
с
большим
В
качестве
количеством
процессоров, которые позволяют параллелизовать обработку модели и ускорить расчет
интересующих показателей. Программирование на видеокартах является сложной и
нетривиальной задачей которая требует от программиста большой внимательности, но
выигрыш в скорости вычислений большой если программа написана адекватно
исследуемой задаче.
Цель диссертационной работы
Целью данной работы является моделирование фазового перехода с помощью
двумерной
модели Изинга с ближним взаимодействием спинов и большим числом
элементов с использование видеокарты для численного моделирования и сравнение
прироста производительности с вычислением на обычном процессоре и кластере.
Для достижения указанной цели были поставлены следующие задачи:
1. Разработка алгоритма для видеокарты на основе метода Монте-Карло и
алгоритма Метрополиса.
2. Реализация данного алгоритма для вычисления на современных видеокартах
3. Изучение фазового перехода в двумерной модели Изига с ближним
взаимодействием. Исследование влияния внешнего магнитного поля на
фазовый
переход
в двумерной
модели
Изинга.
Построение
петли
гистерезиса для двумерной модели Изинга при различной температуре
теплового резервуара. Исследование фазового перехода с безспиновыми
3
примесями.
4. Сравнение результатов численных экспериментов при использовании
видеокарты, процессора и кластера.
Научная новизна
Научная новизна заключается в том, что:
1. Разработанный в ходе работы алгоритм оптимизирован для выполнения на
видеокарте и удовлетворяет основным требованиям при программировании
на видеокарте
2. Впервые методом вычислений на видеокартах решены задачи:
1. Описан фазовый переход в модели Изинга как без внешнего поля так и
при воздействии внешнего поля
2. Исследованы фазовые переходы в решётке с примесями
3. Построены петли гистерезиса
3. Показано прирост производительности вычисления основных параметров
значительно выше по сравнению с вычислением на обычных компьютерах и
на кластере
4. Показано что размер решетки изучаемой модели Изинга практически не
влияет на производительность предложенного алгоритма и поэтому можно
проводить расчеты для достаточно больших решеток
Методы исследования
Фазовый переход исследуется с помощью двумерной модели Изинга в которой
учтены ближние взаимодействия. Для численного моделирования используется метод
Монте-Карло с алгоритмом Метрополиса. Программа реализующая алгоритм написана на
языке C и использует видеокарту в качестве сопроцессора для расчетов.
Достоверность результатов
Достоверность результатов обеспечивается использование точной математической
модели, а также соответствием полученных экспериментальным наблюдениям, а также
результататам полученных в других исследованиях других авторов.
Научная и практическая значимость
Материалы диссертационного исследования по исследованию фазовых переходов и
критических явлений в модели Изинга численными методами Монте-Карло с алгоритмом
4
Метрополиса с использованием видеокарты в качестве сопроцессора и инструмента для
распараллеливания имеет практическую значимость так как перенос алгоритма на
видеокарту позволил ускорить численный расчет модели Изинга по сравнению со
стандартными компьютерами и кластерами. Также использование видеокарты позволило
увеличить размеры моделируемой решётки без ущерба производительности.
На защиту выносятся следующие основные положения:
1. Использование видеокарты позволяет ускорить вычисление стандартной
двухмерной модели Изинга и таким образом увеличить количество
проводимых экспериментов
2. Написанный алгоритм для видеокарты повторяет результаты полученные
при расчетах на обычном компьютере.
3. Использование видеокарты позволяет увеличить размер моделируемой
решетки без ущерба производительности.
4. Внедрение безспиновых примесей снижает температуру фазового перехода
Апробация работы
Работа была выполнена на кафедре общей и теоретической физики Самарского
Государственного Университета. Расчеты были проведены на кластере «Королёв» с
использованием видеокарт Nvidia Tesla C1060.
5
ГЛАВА 1
ИССЛЕДОВАНИЕ
ФАЗОВЫХ
ПЕРЕХОДОВ,
МОДЕЛЬ
ИЗИНГА
1.1 Фазовые переходы и критические явления
Исследование
фазовых
переходов
ведётся
с
конца
19
века.
Первым
экспериментальным изучением фазового перехода было изучение критической точки
жидкость - пар. Самым известным после фазового перехода жидкость - пар - твердое тело
является фазовый переход в магнетиках под которым понимают изменение магнитного
состояния тела. Магнитные моменты электронов в обычном состоянии направлены в
разные стороны, поэтому их векторная сумма близка к нулю, но в некоторых случаях
магнитные моменты становятся сонаправлены и происходит фазовый магнитный переход.
Одним из примеров фазового перехода является явление сверхпроводимости в
некоторых материалах. При понижении температуры материала его магнитное поле
полностью вытесняется из объёма тела, а его сопротивление становится строго нулевым.
этот фазовый переход является одним из самых знаменитых и удивительных. Первое
обнаружение эффекта сверхпроводимости связано с получением жидкого гелия, который
позволил исследовать свойства материалов при сверхнизких температурах. Голландский
физик Камерлинг-Оннес обнаружил, что при температуре 4,2 Кельвина металлическая
ртуть полностью теряет электрическое сопротивление. Далее было доказано, что
сверхпроводники являются полными диамагнетиками, то есть полностью выталкивают из
собственного объёма линии магнитного поля. Основной проблемой практического
применения сверхпроводников является очень низкая температура фазового перехода,
близкая к абсолютному нулю. За годы исследований сверхпроводников и материалов
критическая температура была увеличена лишь до 23,2 Кельвин на интерметаллиде
Nb3Ge. В 1986 году была обнаружена способность керамики на основе оксидов меди,
лантана и бария переходить в состояние сверхпроводника при 30 К. Сложные оксиды меди
были также синтезированы в 1978г русскими учеными, а также французкими
исследователями
двумя
годами
позже.
Главная
особенность
открытия
высокотемпературной сверхпроводимости в том, что это свойство было обнаружено не у
6
обычных интерметаллидов или органических соединений, а у оксидной керамики
проявляющей в основном диэлектрические свойства.
Основной характеристикой фазового перехода является изменение температуры.
Из-за требования термодинамической устойчивости, изменение термодинамических
потенциалов в точке фазового перехода крайне мало. Из этого следует, что возможно
изменение свойств по всему объёму исследуемого материала, то есть скачкообразное
изменение, либо появление чрезвычайно малого объёма новой фазы с отличие её свойств
от старой.
Другой пример фазового перехода является фазовым переходом первого рода при
котором изменяются самые главные параметры вещества, такие как удельный объём,
количество запасённой внутренней энергии, концентрация компонентов и так далее. Это
означает что формально данные параметры испытывают разрыв в точке перехода. К
наиболее распространенным примерам фазовых переходов первого рода относятся:
1. Плавление и кристаллизация
2. Испарение и конденсация
3. Сублимация и десублимация
В первом описанном случае имеет место фазовый переход второго рода, при
котором скачок испытывают различные производные по температуре и которые
характеризуются изменением симметрии состояния. Согласно классификации введённой
П. Эрнфестом, главной характеристикой фазовых переходов второго рода являются скачки
испытываемые вторыми производными от термодинамического потенциала в точке
перехода. Согласно альтернативной классификации М. Фишера также рассматриваются
переходы при которых первые производные непрерывны, а скачок наблюдается у
производных второго и более высоких порядков. Такие фазовые переходы называются
непрерывными[1].
С непрерывными фазовыми переходами связано понятие критической точки. Это
точка на фазовой плоскости, в которой оканчивается кривая фазового равновесия. В точке
фазового перехода первого рода нет никаких особенностей потенциала, в ней
термодинамические потенциалы обеих фаз равны.
Фазовые переходы второго рода сопровождаются изменением симметрии вещества.
7
Изменение симметрии может быть связано со смещением атомов определённого типа в
кристаллической решётке, либо с изменением упорядоченности вещества. Фазе с большей
симметрией соответствует более высокая температура. Однако есть и исключения.
Например в фазовом переходе сегнетовой соли фаза соотвествующая меньшей
температуре обладает ромбической симметрией, а фаза соответствующая высокой
температуре обладает моноклинной симметрией. Общее описание фазового перехода
второго рода как следствия изменения симметрии вещества даётся теорией Ландау.
Наиболее распространенными фазовыми переходами второго рода являются:
1. Магнитные фазовые переходы - переход ферромагнетик - антиферромагнетик и тп.
2. переход жидкого гелия в сверхтекучее состояние
3. переход аморфных материалов в стеклообразное состояние
1.2 Фазовые переходы в магнетиках
Все вещества можно разделить по магнитным свойствам на группы.
Ферромагнетики
характеризуются
самопроизвольной
намагниченностью,
не
исчезающей и в отсутствие внешнего магнитного поля. Силы взаимодействия между
спинами электронов приводят к параллельной ориентации спинов. Магнитные поля
атомов при низких температурах однонаправленные и усиливают друг друга, в результате
чего возникает магнитное поле за пределами материала. Формально самопроизвольная
намагниченность определяется как
M
(
T
)
lim
M
(
T
,H
),
0

H

0
(1.1)
где M(T, H) — равновесная намагниченность в поле Н, T<Tc где Tc температура
критической точки.
С ростом температуры самопроизвольная намагниченность уменьшается и
полностью исчезает в точке Кюри (критической точке), то есть [5]
lim
M
T)0
.
0(
T
T
c
(1.2)
Выше критической температуры намагниченность в отсутствие поля равна нулю,
однако начальная восприимчивость
M



(
T
)
 
0
H


T
,H

0
8
положительна, и при T  Tc функция  0 (T ) неограниченно возрастает, указывая на
возникновение самопроизвольной намагниченности. При изменении знака поля Н
меняется также и знак намагниченности. Поэтому кривая намагниченности М
как
функции поля Н при T  Tc имеет скачок, равный 2M 0 (Рис. 1).
Рис.1. Идеальная кривая намагниченности ферромагнетика
В случае ферромагнетика восприимчивость не является постоянной величиной.
Ферромагнетики — вещества с положительной обменной связью J > 0. Ферромагнетизм
наблюдается в некоторых веществах (например, железо, кобальт, никель) в интервале
температур от 0 К до критической температуры — точки Кюри, выше которой
ферромагнетики ведут себя как парамагнетики.
Для парамагнетиков в определенном интервале температур и полей зависимость
между полем и намагниченностью носит линейный характер: M  H . Величина
восприимчивости
мала
(порядка
103 106 )
и
имеет
положительный
знак.
В
парамагнетиках намагниченность создается параллельная полю, поэтому парамагнитная
восприимчивость положительна [7].
В диамагнетиках восприимчивость мала по абсолютной величине и имеет
отрицательный знак. Диамагнитный эффект проявляется как результат индукционного
воздействия внешнего магнитного поля на молекулярные токи. Здесь в каждом атоме
возникает добавочный магнитный момент, направленный против создающего его
внешнего поля, что и определяет отрицательный знак восприимчивости.
Фазовые переходы в магнетиках — переход вещества из одной группы в другую.
1.3 Модель Изинга
Простейшей моделью для описания явлений фазовых переходов является модель
Изинга описывающая ферромагнетизм. Основной частью данной модели является
9
периодическая n-мерная решетка состоящая из атомов со спином si. При том что в
реальных магнитных материалах спины ориентированы хаотично, в модели Изинга с
другой стороны принимается что спины ориентированы либо в прямом направлении, либо
в обратном то есть si = {+1, -1}.
Модель Изинга описывается следующим гамильтонианом:

H


J
S
S
h
S

i
j
B
i
(1.3)
neighbours
i
где h описывает внешнее магнитное поле а первая сумма описывает сумму магнитных
моментов соседних атомов. Константа J называется константой взаимодействия и
описывает силу взаимодействия между соседними атомами. Модель Изинга описывает
фазовый переход. При нулевом значении внешнего поля есть две фазы разделённых точкой
Кюри Tс также называемой температурой перехода или критической температурой. При
температурах больше чем критическая система находится в так называемой фазе
парамагнетика,
а
при
температурах
ниже
критической
возникает
спонтанная
намагниченность, то есть возникает фазовый переход.
Вероятность нахождения спина в каждом состоянии задаётся распределением Гиббса
1
1
P
 exp(
 H
)
Z
kT
(1.4)
где k – коэффициент Больцмана, Т — температура, Z – нормировочная константа.
1.4 Аналитическое решение модели Изинга
Для модели Изинга существует аналитическое решение при двухмерном и
одномерном случае. Однако двухмерный случай является наиболее интересным, так как
демонстрирует фазовый переход. Для трехмерных моделей аналитическое решение до сих
пор неизвестно.
Для аналитического решения модели Изинга применяется матричный метод. При
рассмотрении линейной цепочки спинов, в которой последней спин имеет значение +1 или
-1, а статистические суммы обозначенные как Z N () и Z N () , а суммарная энергия как
ZN()
 добавление ещё одного спина в цепочку приводит к рекуррентному
ZN()
N 
соотношению N1 MN где M - квадратная матрица перехода определяющаяся как:
10

1
/
2

1
/
21
/
2

1
/
2




x
y
x
y
M
(

)
M
(

)
M






1
/
2
1
/
2 
1
/
2
1
/
2
x
yx
y
M
(

)
M
(

)




а
её
элементы
определяются
добавочными
больцмановскими
множителями,


exp(

J
/
kT
),
y

exp(

2
H
/
kT
)
возникающими при добавлении ещё одного спина x
.
B

J
/(
2
kT
),
L


H
/
kT
,
Если обозначить K
, а статистическую сумму записать в виде
B
N
Z
(
T
,
H
,
N
)

exp(
K
s
s

s
)



ij
i
j
i
, то полная
s


1 (
i
,
j
)
i
i

1
статистическая
сумма
задаётся
собственными векторами и собственными значениями матрицы М. Для нахождения
термодинамического предела достаточно узнать наибольшее собственное значение
f
kT
0 0(K,L), тогда величина свободной энергии на спин  ln

(K
,L
)
0
В своей диссертации Изинг доказал, что в одномерной линейной цепочке спинов,
связанных ближним взаимодействием фазовый переход не существует.
Решение двумерной модели было выполнено Крамером и Ванье на основе матричного
метода для квадратной матрицы с ближним взаимодействием.
Рассмотрим решетку из m строк и зададим конфигурацию m спинов в последнем nm
м столбце. Число возможных конфигураций равно 2 , поэтому матрица перехода имеет
m
m
порядок 2  2 . Наибольшее собственное значение определяет статсумму на один
столбец для бесконечно длинной решетки ширины m. В случае бесконечной плоской
решетки свободная энергия на один спин
f
1

lim
ln

(
m
;
K
,L
)
.
0
m


kT m
В случае нулевого поля статсумма преобразуется сама в себя (симметрия матрицы
перехода) с точностью до несущественного множителя при преобразовании вида
1x
x* 
, которое переводит высокие температуры в низкие и наоборот. Такое
1x
преобразование оставляет неподвижной лишь одну точку, которую обычно отождествляют
с критической температурой [5]. Так Крамерс и Ванье определили критическую точку для
квадратной решетки:
J
1
v

thK

th 
c
c
2
kT

2
c 1
В 1942 году Л. Онсагер получил точное решение для квадратной решетки Изинга в
нулевом магнитном поле. Он нашел решение для задачи Изинга с разными энергиями
11
взаимодействия J и J  в горизонтальном и вертикальном направлениях. По его расчетам




предельная свободная энергия на один спин



d
d
f1
1
2






ln
ch
2
K
ch
2
K

sh
2
K
cos

sh
2
K
cos
1
2
.


kT
2
2
2

В симметричном случае энергия непрерывна в критической точке, но имеет в ней
бесконечную
производную,
что
соответствует
логарифмической
расходимости
T
(
T
)

D
ln
1
 (
T

T
)
c
теплоемкости: C
.
T
c
В случае несимметричной модели ( J  J ) кривая теплоемкости также имеет
симметричную логарифмическую особенность, но ее амплитуда меньше, а критическая
температура ниже [10].
Данная модель позволяла не только объяснить переход, но и определить
температуру фазового перехода. Модель Изинга рассматривалась многими авторами,
которые уточняли методы точного решения задачи описания фазовых переходов [11].
Так, в 1952 году Ч. Янг
объяснил явление спонтанной намагниченности [12].



2

(
T
)

1

(
sh
2
K

sh
2
K
)
Полученный им окончательный результат M
, откуда следует
0
1
/
8
M
(
T
)
A
(
T

T
)1/8.
0
c
(1.5)
Этот закон дает резкий спад намагниченности при температуре T  Tc .
В 1949 году Онсагер и Кауфман рассчитали спиновые корреляционные функции
si s j . Парная корреляционная функция для ближайших соседей пропорциональна
T
T
ln
T
T
c)
c]особенность в критической точке. Оказалось,
энергии и имеет такую же [(
что
следующие
корреляционные
функции
имеют
аналогичную
температурную
зависимость; в частности, они имеют такой же вид особенности в критической точке.
В 1950-1955 гг. Ванье, Темперли, Хаутаппель, Сиози и др. рассмотрели треугольную,
шестиугольную и более сложные типы двумерных решеток. В работе [13] были
исследованы пределы статистической суммы и корреляционной функции для одномерной
и двумерной моделей Изинга со свободными граничными условиями.
Оказалось, что все точные
решения дают симметричную логарифмическую
особенность теплоемкости, и, таким образом, во всех случаях свободная энергия является
2
(
T
)

F

a
(
T

T
)

b
(
T

T
)
ln
T

T

....
c
c
c
c
неаналитической функцией вида F
. Расчет
самопроизвольной намагниченности для разных решеток всегда приводит к закону (1.5) и
корреляционным функциям одного и того же вида. Из этих результатов можно сделать
12
вывод, что аналитическое поведение двумерных решеток в критической точке не зависит
от деталей структуры решетки.
Однако аналитические результаты для трехмерной модели Изинга, а также для
модели Изинга в ненулевом магнитном поле до сих пор не получены. Это сопряжено с
серьезными математическими трудностями, поэтому в настоящее время отдается
предпочтение численным методам исследования.
1.5 Численное моделирование модели Изинга
В данной работе проводится численное моделирование двумерной модели Изинга.
Численное моделирование выполняется методом Монте-Карло с использованием
алгоритма Метрополиса.
Метод Монте-Карло был разработан в Лос-Аламосе и представляет собой
численный метод моделирования случайного процесса. Он основан на том что случайный
процесс моделируется большое количество раз с переносом состояния между повторами.
При моделировании модели Изинга методом Монте-Карло основным фактором
является выбор вероятностью перехода из одного состояния в другое. В качестве объекта
для вычисления вероятности выбирается спин каждого атома в решетке. Далее
вычисляется вероятность переворота спина, то есть перехода его в состояние -si.
В общем виде алгоритм может быть описан так:
1. Задаётся начальная конфигурация решётки.
2. Выбирается атом(узел решётки)
3. Вычисляется вероятность его перехода в другое состояние
4. Вероятность сравнивается со случайным числом
5. Если вероятность больше случайного числа, тогда спин переворачивается
6. Далее переходим к следующему узлу решётки.
Двумерная модель Изинга представляется двумерным массивом состоящим из
единичных значений - состояния спинов в соответствующем узле. Для моделирования с
помощью метода Монте-Карло также используется Алгоритм Метрополиса при
использовании которого вероятность вычисляется из марковской цепи конфигураций.
Использование алгоритма Метрополиса позволяет выбрать те конфигурации решётки при
которых вклад в намагниченность отдельного спина, наибольший. Для этого выбираются
конфигурации спинов с максимальным больцмановским фактором.
13
При перевороте спина, энергия всей системы меняется. Если изменение энергии
отрицательно, то вероятность такого перехода равна единице т.к. система стремится к
своему основному состоянию. При положительном изменение проводится сравнение
функции Метрополиса со случайным числом.
Решетку можно просматривать двумя способами, Первый - регулярный способ при
котором просматриваются все узлы. Второй - случайный выбор узла. При использовании
второго способа не все узлы могут быть просмотрены во время одного шага метода
Монте-Карло что снижает точность и может привести к неверным результатам. Поэтому в
данной работе просмотр решетки выполняется с помощью регулярного способа.
14
ГЛАВА
2
Вычисления
на
видеокартах,
модель
программирования CUDA
В данное время видеокарты используются во многих областях науки. Вычисления
некоторых алгоритмов на видеокартах производится быстрее, чем вычисления на
стандартном процессоре x86. В данный момент основными производителями видеокарт
для вычислений являются Nvidia и ATI/AMD, которые также разрабатывают программные
модели и инструменты для вычислений на видеокартах. Более стабильной является
технология Nvidia CUDA, которая использовалась в данной работе. В данной главе
приводится классификация модели вычислений видеокарты Nvidia относительно
классических компьютеров [15].
2.1 Видеокарта как многоядерный и многопоточный процессор.
Архитектуры компьютеров могут быть классифицированы с помощью таксономии
Флинна.
В зависимости от количества параллельных команд и потоков данных архитектура может
быть классифицирована как:
 SISD - Single Instruction, Single Data (Одна команда, Один поток данных)
Последовательный компьютер без возможности параллельных вычислений.
 MISD - Multiple Instruction, Single Data (Множество команд, Один поток данных)
Гетерогенная система, в которой несколько команд оперируют единым потоком
данных и синхронизированы между собой.
 SIMD - Single Instruction, Multiple Data (Одна команда, Множество потоков данных)
Компьютер, который оперирует несколькими потоками данных применяя к ним
единую операцию.
 MIMD - Multiple Instruction, Multiple Data (Множество команд, Множество потоков
данных) Несколько автономных процессоров исполняют различные команды на
нескольких потоках данных, то есть выполняют параллельную обработку.
В данный момент современные суперкомпьютеры имеют большое количество узлов
с архитектурой MIMD, где каждый узел также может осуществлять операции на
несколькими потоками данных, для реализации параллелизма задач и параллелизма
данных. Однако при обработке большого количества данных одним и тем же способом
SIMD архитектура имеет некоторые преимущества над гетерогенными системами.
Примерами архитектуры SIMD могут служить процессоры APE (Array processor
15
experiment) или apeNEXT совершающие операции над векторами, а также графические
процессоры, содержащие большое количество параллельных ядер для обработки
большого объёма графических данных. Например, в модели программирования CUDA
можно использовать все графические процессоры для параллельной обработки векторных
данных, но также можно использовать их и для отдельных скалярных операций что
нетипично для систем с архитектурой SIMD. Nvidia ввела новый термин для определения
архитектуры собственных видеокарт SIMT - Single Instruction, Multiple Thread (Одна
инструкция, Множество потоков). Данная архитектура подразумевает что хотя устройство
работает по модели SIMD, каждая группа потоков имеет свою регистровую память и
отдельную область в потоке данных, что позволяет достигнуть параллелизма на уровне
потоков.
Для того чтобы иметь представление о потенциале видеокарт для вычислений, в
3ей
главе
представлены
результаты
сравнения
производительности
стандартных
процессоров Intel и видеокарт Nvidia. Различия в производительности двух архитектур при
операциях с плавающей точкой возникают из-за того что большее количество
транзисторов видеокарты отдано под обработку данных, а не контроль вычислений и
кеширование данных что. Только процессор Intel имеет иерархию кешей, а видеокарта не
содержит в себе иерархии кешей и использует одноуровневый кеш для совершения
операций. Для компенсации некешируемых запросов к памяти и для достижения высокой
скорости передачи данных необходимое количество арифметических операций за одну
операцию с памятью, на видеокарте, должно быть превышать одну операцию. Главная
идея - скрыть операции доступа к памяти с помощью совершения вычислений вместо
загрузки данных из основной памяти в кеш. С точки зрения программиста программа на
видеокарте исполняется на большом количестве потоков число которых превышает общее
количество
вычислительных
модулей
на
физическом
устройстве.
Приложения,
оптимизированные для исполнения на видеокартах, должны разделять основную задачу на
набор подзадач, которые решаются независимо друг от друга с помощью большого
количества потоков, исполняющихся на физических процессорах видеокарты.
Так как видеокарта способна управлять очень большим количеством потоков без
дополнительной нагрузки, программист может увеличивать количество подзадач вне
зависимости от количества физических процессоров. С другой стороны программисту
необходимо удостовериться, что все потоки обращаются к памяти по определенным
алгоритмам, чтобы избежать состояния гонки, которое может наступать при увеличении
количества
параллельных
потоков.
Также
16
для
обеспечения
максимальной
производительности программисту необходимо задействовать разделяемую память
видеокарты. С одной стороны, использование разделяемой памяти ускоряет обмен
данными между потоками видеокарты, но с другой стороны программы необходимо
оптимизировать для использования разделяемой памяти и контролировать доступ потоков
к разделяемой памяти для того, чтобы избежать состояния гонки.
Написание программ для видеокарт сильно отличается от написания программ под
обычные процессоры, хотя фундаментальные аспекты программирования схожи. В
следующем параграфе будет описана программная модель CUDA для видеокарт Nvidia.
2.2 Программная модель CUDA
Для программирования на видеокартах используется специальный программный
интерфейс также называемый программной моделью. Программная модель CUDA
используется в качестве интерфейса для специальных программ, написанных на C и C++ и
позволяет им исполняться на графических картах Nvidia. Программная модель управляет
тремя основными абстракцями - группой потоков, разделяемой памятью и барьерной
синхронизацией.
CUDA расширяет язык программирования C позволяя программисту определять
функции на C также и далее называемые “ядрами”, которые при вызове выполняются N
раз параллельно с помощью N потоков, исполняемых на видеокарте. Поток CUDA - это
копия ядра, которая исполняется независимо от других потоков с собственными
регистровыми счётчиками, данными и алгоритмом, но в обшем случае алгоритм у всех
потоков совпадает.
Использование CUDA подразумевает что все потоки выполняются на отдельном
физическом устройстве - видеокарте которая выступает в роли сопроцессора к программе
выполняемой на обычном компьютере. Вызов кода ядра в основной программе
немедленно запускает её на устройстве и продолжает выполнение кода основной
программы до следующего вызова ядра.
Ядро определяется с помощью идентификатора функции __global__. а количество
потоков исполняющих ядро определяется с помощью специальных операторных скобок:
<<<....,...>>>
Пример ядра:
__global__ void addMat(float A[N][N], float B[N][N], float C[N][N]) {
int i = blockIdx.x*blockDim.x+threadIdx.x;
int j = blockIdx.y*blockDim.y+threadIdx.y;
17
if((i<N)&&(j<N)) C[i][j] = A[i][j]+B[i][j];
}
//main
int main(){
dim3 block(16,16);
dim3 grid((N+block.x-1)/block.x,(N+block.y-1/block.y);
//kernel
addMat<<<grid,block>>>(A,B,C);
}
В данном примере каждый поток исполняющий ядро использует уникальные
ячейки данных которые выделяются с помощью встроенных переменных threadIdx,
blockIdx, blockDim. Потоки выполняют сложение на этом уникальном наборе данных и
выполняются параллельно. Количество потоков задаётся с помощью операторных скобок
<<<... , ...>>>. Данный синтаксис применяется для организации потоков CUDA в так
называемые блоки потоков, которые составляют двухмерную сетку из блоков. Потоки
CUDA внутри блока могут быть идентифицированы по одномерному, двухмерному и
трехмерному индексам. Индексы доступны внутри ядра через встроенную переменную
threadIdx. Также каждый блок потоков может быть идентифицирован одномерным и
двухмерным индексом с использование встроенной переменной blockIdx. Соответствие
каждого блока по этим индексам и набора данных позволяет получать доступ к наборы
даных как к вектору, матрице или полю.
Во время исполнения потоки CUDA могут обращаться к данным из нескольких
пространств памяти. Все потоки обладают собственной локальной памятью(L) и имеют
доступ к некешируемой глобальной памяти. Каждый блок потоков имеет доступ к
разделяемой памяти которая открыта для все потоков внутри блока и выделяется на время
существования блока. В дополнение, все потоки имеют доступ к константной памяти и
памяти текстур, которые представляют из себя кешированые блоки памяти, доступные
только для чтения.
Потоки внутри блока могут работать друг с другом с помощью разделяемой памяти
и синхронизации собственного выполнения для координирования доступа к памяти. Для
синхронизации потоков внутри блока используется встроенная функция __syncthreads().
При достижении этой функции в коде ядра, поток должен остановится и ожидать
выполнения других потоков прежде чем продолжить собственное выполнение. Однако нет
18
способа синхронизировать потоки внутри различных блоков. Единственным признаком
завершения все блоков является завершение ядра.
Так как код ядра выполняется несколькими одинаковыми по размеру блоками
потоков, необходимо чтобы независимо выполняющиеся блоки могли исполнятся в любом
порядке, параллельно или последовательно - в этом одно из новых отличий архитектуры
CUDA от SIMD в которой потоки выполняются в строго заданной последовательности.
Однако плюс архитектуры CUDA в том что потоки могут выполнятся в любом порядке, а
значит упрощенно написание унитарного кода для ситуаций с несколькими процессорами
и при увеличении количества процессоров код работает так же. С другой стороны метод
написания программ для CUDA накладывает на программиста дополнительные
ограничения в связи с возможными состояниями гонки. Количество блоков обычно
выбирается исходя из объёма данных, а не из количества физических процессоров.
2.3 Архитектура видеокарты для вычислений на примере Nvidia Tesla
Все программы CUDA выполняются путём соотнесения параллельных задач с
блоками потоков которые размещаются на сетке и выполняют вычислительную задачу на
каждом из потоков. Для того чтобы сделать эти операции как можно более быстрыми
необходимо знать каким образом видеокарта исполняет данные потоки. В качестве модели
используется архитектура видеокарты Nvidia Tesla которая представляет собой массив из
поточных мультипроцессоров каждый из которых состоит из 8 скалярных процессоров,
двух специальных устройств для трансцедентных чисел, многопоточного устройства
команд и чипа разделяемой памяти. Графические устройства Tesla C1060 содержат 30
мультипроцессоров и также содержат блок для вычислений с двойной точностью.
Когда программа CUDA работающая на процессоре компьютера запускает ядро,
блоки соответствующей сетки распределяются на мультипроцессоры в зависимости от их
количества и вычислительной мощности. Потоки одного блока выполняются в рамках
вымещающей многозадачности на одном мультипроцессоре. Как только блок завершается,
то на освобождённом мультипроцессоре запускаются следующие блоки. В зависимости от
геометрии блока, каждый мультипроцессор может принять на исполнение до 1024 потоков
распределённых по 8 блокам. Каждая группа потоков распределяется в так называемую
основу, состоящую из 32 потоков которая распределяется по 8 скалярным процессорам на
мультипроцессоре. Процессоры выполняют потоки паралельно и независимо друг от
друга.
Чтобы
избежать
простоя
скалярных
процессоров
планировщик
потоков
мультипроцессора постоянно меняет основы на процессорах для того чтобы всегда имелся
19
поток для выполнения.
Данный метод планирования потоков необходим чтобы компенсировать долгие
операции по чтению и записи в глобальную память. Если количество потоков больше чем
количество скалярных процессоров, то моменты простоя процессоров при совершении
операций с памятью становятся незаметны так как в этот момент на выполнение ставится
другой поток. Согласно инструкциям CUDA использовать количество потоков которое
меньше либо равно количеству процессоров не эффективно и необходимо избегать
данного подхода.
20
ГЛАВА 3 Разработка алгоритма для численного моделирования
на видеокарте, результаты вычислений.
В качестве базы для разработки параллельного алгоритма для вычислений
использовался стандартный линейный алгоритм, который был переработан в соответствии
с моделью программирования CUDA для ускорения вычислений. Основной проблемой
при разработке алгоритма было правильное использование всех блоков памяти доступных
видеокарте, а также правильное распределение потоков для обработки матрицы спинов.
Алгоритм был разработан для численного моделирования двумерной модели Изинга
методом Монте-Карло с использованием алгоритма Метрополиса без учета воздействия
внешнего поля и позже был доработан для моделирования взаимодействия спинов с
учетом внешнего постоянного магнитного поля.
Расчет проводился в нескольких средах и его результаты были сравнены с
результатами обычного линейного алгоритма моделирования. Для расчёта использовались
видеокарты Nvidia GeForce GTX 660, Nvidia Tesla K20c, Nvidia Tesla 2070. Для сравнения
линейный алгоритм расчета был вычислен на домашнем процессоре AMD FX 4170.
В процессе моделирования были проведены исследования температуры фазового
перехода на решетках разного размера. Также был построен гистерезис и проведено
численное моделирование в примесной решетке. Была выведена зависимость флуктуации
температуры перехода от размера решётки, при больших размерах решётки флуктуации
практически
полностью
исчезают.
Все
результаты
численных
экспериментов
представлены далее в главе.
Основным результатом проведенных экспериментов является ускорение численного
моделирования практически в 25 раз на видеокарте, по сравнению с обычным
процессором.
21
3.1 Разработка алгоритма для выполнения на видеокарте
В приведённом в главе 2 анализе модели программирования CUDA было указано
что части алгоритма обрабатываются параллельно процессорами видеокарты. Это значит
что необходима декомпозиция решётки спинов на части которые будут обрабатываться
параллельно.
В качестве метода для декомпозиции была выбрана так называемая шахматная
декомпозиция решётки. Её смысл заключается в разделении полной решётки на чётные и
нечётные блоки равного размера. Чётными называются блоки координаты которых чётны,
а нечётными в другом случае. После разделения на блоки алгоритм сначала проводит
обновление спинов в соответствии с алгоритма Метрополиса, далее проводится
обновление всех нечётных блоков решётки. После проведения обеих операций которые
вместе называются флипом, все спины принимаются в расчёт и формирование общей
решётки завершается. Вся процедура декомпозиции и флипа отображена на рисунке 2.
Рис.2 Процедура шахматной декомпозиции и флипа. Блоки спинов находятся в квадратах
решётки.
Крестами обозначены обновленные в соответствии с алгоритмом Метрополиса блоки.
Необходимость разделения спинов следует из правил программирования CUDA.
Так как блоки кода выполняются параллельно, то точный хронологический порядок
обновления неизвестен, а так как алгоритм Метрополиса требует подсчёта гамильтониана
каждого спина, то изменение соседних спинов в момент расчёта гамильтониана
запрещено. Также шахматная декомпозиция позволяет избежать состояния гонки в
алгоритме.
Каждому блоку ставится в соответствие свой мультипроцессор на видеокарте,
поэтому необходимо иметь достаточное число блоков для того чтобы мультипроцессоры
на видеокарте н простаивали.
Для максимального ускорения алгоритма используется разделяемая память в
которую полностью загружаются блоки основной решётки.
22
Есть две причины использования разделяемой памяти:
1. Запрос к основной памяти выполняется только один раз при копировании
решётки в память и так как размер блока загружаемого в память кратен
степени двойки, то скорость копирования блока в разделяемую память
увеличивается.
2. Ближнее взаимодействие спинов такое же как по все решётке, что позволяет
получать доступ к спинам в разделяемой памяти также как доступ к спинам
в глобальной памяти.
В данном алгоритме не используются граничные к блоку спины, так как их
использование может привести к уменьшению скорости копирования решётки в
разделяемую память. К тому же запрос к соседнему спину выполняется только один раз,
что делает непрактичным его копирование в разделяемую память.
В качестве генератора случайных чисел используется библиотека CURandom
которая позволяет генерировать случайные числа прямо на видеокарте и ускорить
выполнение
алгоритма.
Качество
генерируемых
случайных
чисел
определяется
библиотекой и достаточно высоко для совершения математического моделирования
алгоритмом Метрополиса.
3.2 Алгоритм моделирования.
Ниже представлена
программа
написанная на языке
C
для
численного
моделирования модели Изинга на видеокарте.
#define BLOCK_SIZE 16
#define E_CONST 2.71828182845904523536f
//! Ядро для проведения симуляции:
//! @param lattice Ссылка на полную решётку спинов
//! @param height. Количество строк решётки
//! @param width Количество столбцов решётки
//! @param T Температура используемая в алгоритме метрополиса.
__global__ void ising(const int * lattice_in, int * lattice_out, int height, int width, float T,
unsigned long long seed) {
//Инициализация блока основной решётки
23
__shared__ int slattice[BLOCK_SIZE][BLOCK_SIZE];
__shared__ int sneighbors[4 * BLOCK_SIZE];
//Вычисление рабочих индексов блока на основе встроенных функций
int tx = blockIdx.x * BLOCK_SIZE + threadIdx.x;
int ty = blockIdx.y * BLOCK_SIZE + threadIdx.y;
int top, bottom, left, right;
float deltaU;
curandStatePhilox4_32_10_t state;
//Инициализация генератора случайных чисел.
curand_init(seed, ty * width + tx, 0, &state);
//Основная часть симуляции
//Копирование блока в разделяемую память.
slattice[threadIdx.y][threadIdx.x] = lattice_in[ty * width + tx];
//Копирование значений блока.
if(tx < width && ty < height) {
if(threadIdx.y == 0) {
if(ty == 0)
sneighbors[threadIdx.x] = lattice_in[(height - 1) * width + tx];
else
sneighbors[threadIdx.x] = lattice_in[(ty - 1) * width + tx];
}
if(threadIdx.y == (BLOCK_SIZE - 1)) {
if(ty == (height - 1))
sneighbors[2 * BLOCK_SIZE + threadIdx.x] = lattice_in[tx];
24
else
sneighbors[2 * BLOCK_SIZE + threadIdx.x] = lattice_in[(ty + 1) *
width + tx];
}
if(threadIdx.x == 0) {
if(tx == 0)
sneighbors[3 * BLOCK_SIZE + threadIdx.y] = lattice_in[ty *
width + (width - 1)];
else
sneighbors[3 * BLOCK_SIZE + threadIdx.y] = lattice_in[ty *
width + (tx - 1)];
}
if(threadIdx.x == (BLOCK_SIZE - 1)) {
if(tx == (width - 1))
sneighbors[BLOCK_SIZE + threadIdx.y] = lattice_in[ty * width];
else
sneighbors[BLOCK_SIZE + threadIdx.y] = lattice_in[ty * width +
(tx + 1)];
}
//Синхронизация блока со всеми остальными потоками
__syncthreads();
25
Выполение алгоритма Монте-Карло, с количеством шагов равным 500. Алгоритм
выполняется в соответствии с процедурой шахматной декомпозиции решётки.
for(int k = 0; k<500;k++){
for(int i = 0; i < 2; i ++) {
//Процедура шахматной декомпозиции
if((threadIdx.x + threadIdx.y) % 2 == i) {
if(threadIdx.y == 0)
top = sneighbors[threadIdx.x];
else
top = slattice[threadIdx.y - 1][threadIdx.x];
if(threadIdx.x == 0)
left = sneighbors[3 * BLOCK_SIZE + threadIdx.y];
else
left = slattice[threadIdx.y][threadIdx.x - 1];
if(threadIdx.y == (BLOCK_SIZE - 1))
bottom
=
sneighbors[2
*
BLOCK_SIZE
threadIdx.x];
else
bottom = slattice[threadIdx.y + 1][threadIdx.x];
if(threadIdx.x == (BLOCK_SIZE - 1))
right = sneighbors[BLOCK_SIZE + threadIdx.y];
else
26
+
right = slattice[threadIdx.y][threadIdx.x + 1];
// Вычисление энергии текущего спина.
deltaU = slattice[threadIdx.y][threadIdx.x] * (top + bottom + left + right);
//Если энергия спина стала отрицательной то его необходимо перевернуть так как
решётка стремится к своему изначальному состоянию при отрицательной энергии.
if(deltaU <= 0)
slattice[threadIdx.y][threadIdx.x] *= -1;
else {
//Генерация случайного числа
float rand = curand_uniform(&state);
//Подсчёт вероятности переворота спина и сравнение со генерированным
случайным числом
if(rand < powf(E_CONST, -2 *deltaU/T))
slattice[threadIdx.y][threadIdx.x] *= -1;
}
}
if((threadIdx.x == 0) || (threadIdx.x == (BLOCK_SIZE - 1)) || (threadIdx.y == 0) ||
(threadIdx.y == (BLOCK_SIZE - 1)))
//Копирование блока в выходную решётку
lattice_out[ty * width + tx] = slattice[threadIdx.y][threadIdx.x];
__syncthreads();
lattice_out[ty * width + tx] = slattice[threadIdx.y][threadIdx.x];
}
После одного выполнения ядра решётка обновляется в соответствии с процедурой
шахматной декомпозиции. Каждый блок становится обновленным в соответствии с
алгоритмом Метрополиса. После этого проводится такая же операция над нечётными
блоками и решётка полностью обновляется. После этого высчитывается намагниченность
27
решётки при данной температуре.
Блок основной инициализации параметров решётки и параметров алгоритма в
целом, а также сохранение результатов для дальнейшего анализа и построения графика.
int main(int argc, char ** argv) {
//Инициализация файла с результатами.
std::ofstream outfile ("results.txt",std::ofstream::out);
// Высота и ширина решётки.
int height;
int width;
//Количество шагов
long n = 8;
//Задание размерности решётки
height = 1024;
width = height;
//Создание структуры решётки
int * lattice = (int *)malloc(sizeof(int) * height * width);
int * lattice_d1 = NULL;
int * lattice_d2 = NULL;
//Инициализация блоков CUDA
cudaError_t cuda_ret;
//Размер блока и сетки блоков выбирается относительно размера блока процедуры
шахматной декомпозиции для наибольшего распределения решётки по физическим
процессорам.
dim3 blockDim(BLOCK_SIZE, BLOCK_SIZE, 1);
dim3 gridDim(ceil(height/BLOCK_SIZE), ceil(width/BLOCK_SIZE), 1);
unsigned long long seed;
28
float magnetization = 0;
cudaEvent_t start, stop;
cudaStream_t stream; // Single Stream to Use as Device Sync
cudaStreamCreate(&stream);
float kernelTime = 0;
float totalKernelTime = 0;
//Инициализация генератора случайных чисел
srand(time(NULL));
//Таймер для подсчёта времени выполнения
cudaEventCreate(&start);
cudaEventCreate(&stop);
Начальная инициализация решётки, все спины направленны вверх
for(int i = 0; i < (height * width); i++) {
//lattice[i] = (rand() % 2 ? 1 : -1);
lattice[i] = 1;
}
Основной цикл по температуре с шагом 0.01
for(float T = 1.0; T < 3.0; T += 0.01) {
Сохранение решётки в памяти видеокарты
cudaMalloc((void **)&lattice_d1, sizeof(int) * height * width);
cudaMemcpyAsync(lattice_d1,
lattice,
height
*
width
cudaMemcpyHostToDevice, stream);
cudaMalloc((void **)&lattice_d2, sizeof(int) * height * width);
seed = rand();
29
*
sizeof(int),
//Вызов ядра для совершения процедуры переворота блоков.
cudaEventRecord(start, 0);
for(int k = 0; k < n; k++) {
if(k%2 == 0){
ising<<<gridDim, blockDim, 0, stream>>>(lattice_d1, lattice_d2, height, width, T, seed);
}else{
ising<<<gridDim, blockDim, 0, stream>>>(lattice_d2, lattice_d1, height, width, T, seed);
}
}
cudaThreadSynchronize(); //Синхронизация потоков для правильного замера
времени выполнения ядра
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&kernelTime, start, stop);
totalKernelTime += kernelTime;
cuda_ret = cudaDeviceSynchronize();
if(cuda_ret != cudaSuccess) FATAL("Unable to launch/execute kernel", cuda_ret);
Сохранение основной решётки в памяти компьютера.
if(n%2 == 0){
cudaMemcpy(lattice,
lattice_d2,
height
*
width
*
sizeof(int),
cudaMemcpyDeviceToHost);
}else{
cudaMemcpy(lattice,
lattice_d1,
cudaMemcpyDeviceToHost);
}
30
height
*
width
*
sizeof(int),
Подсчёт намагничивания
magnetization = 0;
for(int i = 0; i < (height * width); i++) {
magnetization += lattice[i];
}
magnetization /= (height * width);
printf("%f %f\n", T, magnetization);
outfile<<T<<"\t"<<magnetization<<"\n";
sprintf(filename, "T%.2f", T);
}
outfile.close();
cudaEventDestroy(start);
cudaEventDestroy(stop);
Вычисление времени выполнения ядра
printf("Average kernel execution time: %f ms\n", totalKernelTime/300.0f);
char c;
std::cin>>c;
return 0;
}
Данная программа использует все рекомендации по программированию на
видеокартах. Также для обеспечения максимальной производительности используется
разделяемая память и размер блока кратный двойке для ускорения обмена с памятью.
31
3.3 Фазовый переход в двумерной модели Изинга
Рассмотрим классическую двумерную модель Изинга с гамильтонианом

H


J
S
S
h
S

i
j
B
i
neighbours
i
где J - константа взаимодействия между спинами,  B - магнетон Бора, S i - значение спина
в i-м узле решетки, h - внешнее поле. В данном разделе будем полагать внешнее магнитное
поле равным нулю, т. е. h=0.
Используя ранее описанные алгоритм моделирования поведения модели Изинга в
тепловом резервуаре с использованием метода Монте-Карло и алгоритма Метрополиса,
были проведены численные эксперименты с целью наблюдения фазового перехода
«ферромагнетик-парамагнетик» с использованием технологии CUDA и видеокарт
NVIDIA. Результаты проведенных симуляций для двумерных решеток с различным
количеством узлов (64*64, 128*128, 256*256, 512*512, 1024*1024) представлены на
рисунке 2.
32
Рис.2. Зависимость намагниченности двумерной модели Изинга M от температуры
резервуара T при различных значениях длины двумерной квадратной решетки N.
Фазовый переход наблюдается в районе температуры T=2,27. При исследовании
зависимости намагничености от температуры на малых решетках (64*64) в области
фазового перехода наблюдаются большие (50% исследуемой величины) флуктуации
намагниченности (сумма всех спинов). Источником данных флуктуаций является
конечность размеров исследуемой двумерной модели Изинга. При увеличении размеров
двумерной решетки данные флуктуации уменьшаются и практически исчезают на решетке
1024*1024.
Также на рисунке 2 приведено время выполнения программы (в секундах) для
двумерных решеток с различным числом узлов. Было замечено, что данное время
оказывается намного меньше, нежели время выполнения данной программе на
современных многоядерных процессорах, что индуцировало проведение тестов по
сравнению времени счета на процессорах (CPU) и видеопроцессорах (GPU), чему
посвящена следующая часть данной главы.
33
3.4 Сравнение быстродействия CPU и GPU при моделировании фазового
перехода в модели Изинга.
В соответствием с перечисленными
преимуществами систем GPU (Глава 2)
представляет интерес исследование быстродействия компьютерных симмуляций на
видеокартах GPU и сравнение этого быстродействия с их CPU аналогами.
Для достижения этой цели было проведено моделирование поведения двумерной
модели Изинга в тепловом резервуаре как с использованием CPU, так с использованием
GPU с технологией CUDA.
Результаты проведенных тестов представлены на рисунке 3.
34
Рис.3. Зависимость времени расчетов для проведения моделирования двумерной модели
Изинга от длины квадратной двумерной решетки с использованием различных
вычислительных устройств.
На рисунке 3 представлены зависимости времени счета от длины двумерной
решетки для различных вычислительных устройств: CPU(CPU: AMD FX(tm)-4170 QuadCore Processor × 4) и GPU(Tesla K20c, Tesla 2070, GeForce GTX 660). Исходя из анализа
проведенных тестов следует, что использование технологий CUDA позволяет достичь
ускорения в 62 раза (Tesla K20c), в 31 раз (Tesla 2070) и в 25 раз (GeForce GTX 660) в
указанном интервале длин двумерных решеток.
3.5 Моделирование поведения двумерной модели Изинга в тепловом
резервуаре под действием внешнего магнитного поля.
Рассмотрим влияние на фазовый переход в модели Изинга внешнего магнитного
поля. Гамильтониан данной модели имеет H
вид


J
S
S

h
S

i
j
B
i
Высокая
вычислительная
neighbours
i
эффективность
видеокарт (GPU) по сравнению с обычными процессорами (CPU) позволяет проводить
большое количество численных экспериментов за одинаковое время.
Результаты численного моделирования фазового перехода в двумерной модели
Изинга под действием внешнего магнитного поля представлены на рисунке 4.
35
Рис.4. Зависимость намагниченности двумерной модели Изинга M от температуры
резервуара T при различных значениях внешнего магнитного поля H.
36
На графиках представлена зависимость намагниченности двумерной модели
Изинга от термодинамической температуры при различных значениях внешнего
магнитного поля. Из анализа рисунков следует, что при увеличении внешнего магнитного
поля температура фазового перехода увеличивается. Это связано с тем, что в данной
моделе магнитное поле взаимодействует с каждым спином и препятствует хаотическому
разупорядочиванию спинов в тепловом резурвуаре, что и приводит к увеличению
температуры фазового перехода. Также на графиках наблюдается уширение фазового
перехода.
3.6 Гистерезис в двумерной модели Изинга под действием внешнего
магнитного поля.
Важным с точки зрения приложения к практике, является такое свойство
физических систем как гистерезис (петля гистерезиса).
Гистере́зис (греч. ὑστέρησις — отстающий) — свойство систем (физических,
биологических и т. д.), мгновенный отклик которых на приложенные к ним воздействия
зависит в том числе и от их текущего состояния, а поведение системы на интервале
времени во многом определяется её предысторией. Для гистерезиса характерно явление
"насыщения", а также неодинаковость траекторий между крайними состояниями (отсюда
наличие остроугольной петли на графиках).
37
Рис.5. Зависимость намагниченности двумерной модели Изинга M от величины
38
магнитного поля H при различных значениях температуры резервуара T.
На графиках изображена зависимость намагниченности двумерной модели Изинга
в зависимости от внешнего магнитного поля. При температуре, меньшей температуры
фазового перехода наблюдается петля гистерезиса, которая указывает на значимость
предыстории исследуемой спиновой системы. При температуре, близкой к температуре
фазового перехода петля гистерезиса сжимается (в пределе переходит в линию) по
направлению вертикальной оси. При температуре, превышающей температуру фазового
перехода, наблюдается плавный переход.
3.7 Влияние бесспиновых примесей на фазовый переход в модели Изинга.
В реальных магнетиках наряду с атомами имеющими определённый спин, имеются атомы
которые не обладают спином. Эти атомы называются примесными атомами в магнетике.
Данные материалы весьма распространены в природе, их наличие обуславливается
несовершенством технологии производства или другими более сложными факторами.
Поэтому интерес представляет моделирование данных ферромагнитных материалов.
Моделирование можно провести в рамках модели Изинга включив в узлы решетки Изинга
немагнитные примеси, то есть формально сделав их «пустыми». Процентное содержание
примесей можно менять. Предложенная программа позволяет смоделировать такую
модифицированную модель Изинга и исследовать их влияние на температуру фазового
перехода. На рисунке 6 построены графики намагниченности для моделей с разным
количеством примесей
39
Рис. 6 Зависимость намагниченности двумерной модели Изинга от температуры теплового
резервуара при различной концентрации примесей
Введенный параметр "чистота" определяет концентрацию спинов (+1) или (-1) в
узлах решетки. Когда данный параметр равен единице, то это означает, что в каждом узле
исследуемой двумерной решетки находится частица со спинов +1 либо -1. Когда параметр
принимает значение 0.9, следует, что в 10% узлах решетки находятся (случайным образом
генерируются) бесспиновые примесные частицы. Зависимости картины фазового перехода
от концентрации примесных частиц и представлены на данном рисунке. Из анализа
графиков следует, что при увеличении концентрации бесспиновых примесных частиц
наблюдается уменьшение температуры фазового перехода и его уширение.
40
Заключение
1. Разработан алгоритм для вычислений методом Монте-Карло на видеокарте
2. Составлена программа вычисления магнитного момента парамагнетика методом
Монте-Карло
3. Составленная программа благодаря своей структуре может исполнятся на любых
видеокартах поддерживающих технологию CUDA и использует максимальную
возможную мощность оборудования
4. Показано что прирост производительности вычислений параметров фазового
перехода выше по сравнением с вычислением на обычных компьютерах и на
кластере в 60 раз, что указывает на эффективность самой составленной программы
так и технологии вычислений на видеокартах
5. На базе данной программы был успешно описан фазовый переход в модели Изинга
как без внешнего поля так и при наличии внешнего магнитного поля. Проведённые
вычисления не только согласуются с полученными ранее результатами, но и
превосходят их по качеству полученных графиков и по возможности использовать
решетки фактически неограниченных размерностей.
6. Построенная программа позволяла детально исследовать поведение модели Изинга
во внешнем магнитном поле. Была построена петля гистерезиса ферромагнетиках
при разных значениях температур. Результаты блестяще согласовываются с
наблюдаемыми закономерностями в эксперименте. Программа и технология
вычислений позволяет рассматривать любое процентное содержание примесей, что
позволяет весьма корректно и быстро представить результаты исследований.
Например тот факт что температура при повышении процентного содержания
примесей понижается.
7. Результаты
показывают
исследований новой программы составленной
несомненное
преимущество
данной
на видеокартах
технологии
в
практике
моделирования физических процессов при расчетах физических моделей на
решётках. Поэтому развитие данного метода является перспективным как
качественно нового метода моделирования физических процессов
41
Список литературы
[1]. Елесин В.Ф., Кашурников В.А. Физика фазовых переходов: Учебное пособие. М.:
МИФИ, 1997, 180с.
[2]. Г.А.Мартынов. Проблема фазовых переходов в статистической механике//УФН,
Т.169, №6, 1999. С.595-624.
[3]. Lenz W. Beitrage zum Verstandnis der magnetischen Eigenschaften in festen Korpern
//Phys. Zeitschrift. 1920. Bd. S. 613-615.
[4]. http://www.chem.msu.su/rus/teaching/vtsp/
[5]. Фишер М. Природа критического состояния. М.: Мир. – 1968. – 221с.
[6]. Стенли Г. Фазовые переходы и критические явления. М.: Мир. – 1973. – 419с.
[7]. Вонсовский С. В. Магнетизм // Монография. М.: Наука. - 1971. – 1032 с.
[8]. Изюмов Ю.А., Скрябин Ю.Н.. Статичтическая механика магнитоупорядоченных
систем. М.: Наука, 1987.
[9]. Ising E. Beitrag zur Theorie des Ferro- und Paramagnetimus. Hamburg, 1924.
[10].
Onsager L. Crystalstatistics. A two-dimensional
model with order-disorder
transitions// PhysRev.1944.
[11].
Ю.А.
Изюмов,
Ю.Н.
Скрябин.
Статичтическая
механика
магнитоупорядоченных систем. М.: Наука, 1987.
[12].
C.N. Yang. The Spontaneous Magnetization of a Two-Dimensional Ising Model
//PhysRev. 1952. V.85. P. 808-816.
[13].
Ю.М. Зиновьев. Спонтанная намагниченность в двумерной модели
Изинга//ТМФ, 2003. Т.136., С. 444-462.
[14].
B.M. McCoy, Tai Tsun Wu. The two-dimensional Ising model. Cambridge,
MA:Harvard Univ.Press. 1973.
[15].
Cuda programming model. Nvidia Ltd. 2012
[16].
Creighton K. Thomas, A. Alan Middleton Numerically exact correlations and
sampling in the two-dimensional Ising spin glass. PHYSICAL REVIEW E 87, 043303
(2013)
[17].
M. Rojas, Onofre Rojas, S. M. de Souza Frustrated Ising model on the Cairo
pentagonal lattice. PHYSICAL REVIEW E 86, 051116 (2012)
[18].
D. M. Pajerowski, C. R. Rotundu, J. W. Lynn, R. J. Birgeneau Magnetic neutron
(Fe
Co
1

x
x)
2As
2 critical exponents through the tricritical doping.
di_raction study of Ba
PHYSICAL REVIEW B 87, 134507 (2013)
42
[19].
Белоконь В.И., Нефедев К.В., Дьяченко О.И. Распределение случайных
полей обменного взаимодействия и магнитные фазовые переходы //Перспективные
материалы.- 2012.- №6 .- C. 5-9.
[20].
V.I.
Belokon,
K.V.
Nefedev,
O.I.Dyachenko.
Magnetic
ordering
in
thenanoparticles with the RKKY interaction// Book of abstracts. - Parma: Publishing of
Dipartimento di Fisica, 2012. - P.14.
[21].
Таскин, А. Н. Критические индексы с учетом динамического скейлинга для
адсорбции на малых одномерных кластерах / А.Н. Таскин, В.Н. Удодов, А.И.
Потекаев // Известия высших учебных заведений. Физика. 2005, № 8, С.82-87
[22].
Шерешик, А. Ю. Использование модели Изинга на двухмерной решетке для
построения хеш-функции. // Вестник Омского университета. 2012. № 4. С.187-190
[23].
A.J.Ramirez-Pastor, F.Nieto, E.E.Vogel. Ising lattices with ±J second-nearest-
neighbor interactions//PhysRev. 1997.V.55. №21. P.14323-14329.
[24].
Emilio N.M.Cirillo, G.Gonnella, A.Pelizzola. New critical behavior of the three-
dimensional Ising square lattice with nearest-neighbor, next-nearest-neighbor and
plaquette interactions.//PhysRev. 1997. E 55. R17-R20.
[25].
H.J.W.Zandvliet. The 2D Ising square lattice with nearest- and next-nearest-
neighbor interactions.//Europhys. Lett. 2006. №74. P.1123-1124.
[26].
M.Wolf, K.D.Schotte. Ising model with competing next-nearest-neighbour
interactions on the Kagome lattice//J. Phys. A: Math. Gen. 21. 1988. P.2195-2209.
[27].
Соболь И.М.. Численные методы Монте-Карло. М.: Наука, 1973.
[28].
Hall A. On an experiment determination of  . Messeng. Math. №2. 1873.
[29].
Metropolis N., Ulam S. The Monte-Carlo method. J.Amer. Stat. Assos. 44. 247.
1949.
[30].
Физическая энциклопедия, http://dic.academic.ru/dic.nsf/enc_physics/3956/
[31].
Бусленко Н.П., Голенко Д.И., Соболь И.М., Срагович В.Г., Шрейдер Ю.А.
Метод статистических испытаний (метод Монте-Карло)/ Под ред. Ю.А.Шрейдера. М.: Гос. изд-во физ.-мат. литературы. – 1962. – 334с
43
Приложение 1 Код программы для численного моделирования модели
Изинга на видеокарте.
#include <curand_kernel.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <iostream>
#define BLOCK_SIZE 8
#define E_CONST 2.71828182845904523536f
// fatal macro
#define FATAL(msg, ...) \
do {\
fprintf(stderr, "[%s:%d] "msg"\n", __FILE__, __LINE__, ##__VA_ARGS__);\
exit(-1);\
} while(0)
#pragma comment(lib,"cudart")
#pragma comment(lib,"curand")
//! Perform the Ising simulation
//! @param lattice A pointer to the lattice of atoms.
//! @param height The number of rows of the input lattice.ы
//! @param width The number of columns of the input lattice.
//! @param T The temperature, in units of epsilon/k. Epsilon is the exchange energy and k is the
boltzmann constant.
44
//! #param iterations The number of Metropolis iterations to perform.
__global__ void ising(const int * lattice_in, int * lattice_out, int height, int width, float T,
unsigned long long seed) {
__shared__ int slattice[BLOCK_SIZE][BLOCK_SIZE];
__shared__ int sneighbors[4 * BLOCK_SIZE];
int tx = blockIdx.x * BLOCK_SIZE + threadIdx.x;
int ty = blockIdx.y * BLOCK_SIZE + threadIdx.y;
int top, bottom, left, right;
float deltaU;
curandStatePhilox4_32_10_t state;
curand_init(seed, ty * width + tx, 0, &state);
//Perform simulation
//Each turn of the loop performs BLOCK_SIZE^2 iterations of the Metropolis algorithm
slattice[threadIdx.y][threadIdx.x] = lattice_in[ty * width + tx];
//Load sublattice into shared memory
if(tx < width && ty < height) {
if(threadIdx.y == 0) {
if(ty == 0)
sneighbors[threadIdx.x] = lattice_in[(height - 1) * width + tx];
else
sneighbors[threadIdx.x] = lattice_in[(ty - 1) * width + tx];
}
45
if(threadIdx.y == (BLOCK_SIZE - 1)) {
if(ty == (height - 1))
sneighbors[2 * BLOCK_SIZE + threadIdx.x] = lattice_in[tx];
else
sneighbors[2 * BLOCK_SIZE + threadIdx.x] = lattice_in[(ty + 1) *
width + tx];
}
if(threadIdx.x == 0) {
if(tx == 0)
sneighbors[3 * BLOCK_SIZE + threadIdx.y] = lattice_in[ty *
width + (width - 1)];
else
sneighbors[3 * BLOCK_SIZE + threadIdx.y] = lattice_in[ty *
width + (tx - 1)];
}
if(threadIdx.x == (BLOCK_SIZE - 1)) {
if(tx == (width - 1))
sneighbors[BLOCK_SIZE + threadIdx.y] = lattice_in[ty * width];
else
sneighbors[BLOCK_SIZE + threadIdx.y] = lattice_in[ty * width +
(tx + 1)];
}
__syncthreads();
for(int k = 0; k<500;k++){
for(int i = 0; i < 2; i ++) {
46
//Checkerboard
if((threadIdx.x + threadIdx.y) % 2 == i) {
if(threadIdx.y == 0)
top = sneighbors[threadIdx.x];
else
top = slattice[threadIdx.y - 1][threadIdx.x];
if(threadIdx.x == 0)
left = sneighbors[3 * BLOCK_SIZE + threadIdx.y];
else
left = slattice[threadIdx.y][threadIdx.x - 1];
if(threadIdx.y == (BLOCK_SIZE - 1))
bottom
=
sneighbors[2
*
BLOCK_SIZE
+
threadIdx.x];
else
bottom = slattice[threadIdx.y + 1][threadIdx.x];
if(threadIdx.x == (BLOCK_SIZE - 1))
right = sneighbors[BLOCK_SIZE + threadIdx.y];
else
right = slattice[threadIdx.y][threadIdx.x + 1];
//Calculate change in energy if dipole were flipped
deltaU = slattice[threadIdx.y][threadIdx.x] * (top + bottom
+ left + right);
47
if(deltaU <= 0)
slattice[threadIdx.y][threadIdx.x] *= -1;
else {
float rand = curand_uniform(&state);
//Else the probability of a flip is given by the
Boltzmann factor
if(rand < powf(E_CONST, -2 *deltaU/T))
slattice[threadIdx.y][threadIdx.x] *= -1;
}
}
}
}
}
if((threadIdx.x == 0) || (threadIdx.x == (BLOCK_SIZE - 1)) || (threadIdx.y == 0) ||
(threadIdx.y == (BLOCK_SIZE - 1)))
lattice_out[ty * width + tx] = slattice[threadIdx.y][threadIdx.x];
__syncthreads();
lattice_out[ty * width + tx] = slattice[threadIdx.y][threadIdx.x];
}
//! Generate an image file of the lattice and write it to disk
//! @param lattice A 2D array of ints, whose values are either 1 or -1.
//! @param height The number of rows of the lattice
//! @param width The number of colums of the lattice
48
//! @param filename The name of the file to write to.
void print(int * lattice, int height, int width, char * filename) {
char filename_with_ext[64], header[64];
sprintf(filename_with_ext, "%s%s", filename, ".pbm");
std::ofstream outfile (filename_with_ext,std::ofstream::out);
sprintf(header, "P1 %i %i\n", width, height);
outfile.write(header, strlen(header));
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
if(lattice[j + (width * i)] == 1){
outfile.put('1');
}else{
outfile.put('0');
}
outfile.put(' ');
}
outfile.put('\n');
}
}
int main(int argc, char ** argv) {
// Place to build filename
49
char filename[64];
std::ofstream outfile ("results.txt",std::ofstream::out);
// The height and width of the lattice
int height;
int width;
long n = 8;
//float T = strtof(argv[2], NULL);
height = 256;
width = height;
int * lattice = (int *)malloc(sizeof(int) * height * width);
int * lattice_d1 = NULL;
int * lattice_d2 = NULL;
cudaError_t cuda_ret;
dim3 blockDim(BLOCK_SIZE, BLOCK_SIZE, 1);
dim3 gridDim(ceil(height/BLOCK_SIZE), ceil(width/BLOCK_SIZE), 1);
unsigned long long seed;
float magnetization = 0;
cudaEvent_t start, stop;
cudaStream_t stream; // Single Stream to Use as Device Sync
cudaStreamCreate(&stream);
50
float kernelTime = 0;
float totalKernelTime = 0;
//Seed random number generator for kernel call
srand(time(NULL));
//Create timer for timing kernel
cudaEventCreate(&start);
cudaEventCreate(&stop);
for(int i = 0; i < (height * width); i++) {
//lattice[i] = (rand() % 2 ? 1 : -1);
lattice[i] = 1;
}
for(float T = 1.0; T < 3.0; T += 0.01) {
//Initialize input lattice
cudaMalloc((void **)&lattice_d1, sizeof(int) * height * width);
cudaMemcpyAsync(lattice_d1,
lattice,
height
*
width
*
sizeof(int),
cudaMemcpyHostToDevice, stream);
cudaMalloc((void **)&lattice_d2, sizeof(int) * height * width);
seed = rand();
//Call the kernel
cudaEventRecord(start, 0);
for(int k = 0; k < n; k++) {
if(k%2 == 0){
ising<<<gridDim, blockDim, 0, stream>>>(lattice_d1, lattice_d2,
51
height, width, T, seed);
}else{
ising<<<gridDim, blockDim, 0, stream>>>(lattice_d2, lattice_d1,
height, width, T, seed);
}
}
cudaThreadSynchronize(); //Sync kernel to avoid erroneous time measurements
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&kernelTime, start, stop);
totalKernelTime += kernelTime;
cuda_ret = cudaDeviceSynchronize();
if(cuda_ret != cudaSuccess) FATAL("Unable to launch/execute kernel", cuda_ret);
if(n%2 == 0){
cudaMemcpy(lattice,
lattice_d2,
height
*
width
*
sizeof(int),
lattice_d1,
height
*
width
*
sizeof(int),
cudaMemcpyDeviceToHost);
}else{
cudaMemcpy(lattice,
cudaMemcpyDeviceToHost);
}
magnetization = 0;
for(int i = 0; i < (height * width); i++) {
52
magnetization += lattice[i];
}
magnetization /= (height * width);
printf("%f %f\n", T, magnetization);
outfile<<T<<"\t"<<magnetization<<"\n";
sprintf(filename, "T%.2f", T);
}
outfile.close();
cudaEventDestroy(start);
cudaEventDestroy(stop);
printf("Average kernel execution time: %f ms\n", totalKernelTime/300.0f);
char c;
std::cin>>c;
return 0;
}
53
Download