Параллельно-TEBD - Parallel-TEBD

В параллельный TEBD это версия TEBD алгоритм адаптирован для работы на нескольких хостах. Задача распараллеливания TEBD можно было добиться разными способами.

  • В качестве первого варианта можно использовать OpenMP API (вероятно, это был бы самый простой способ сделать это), используя директивы препроцессора, чтобы решить, какую часть кода следует распараллелить. Недостатком этого является то, что человек ограничивается Симметричная многопроцессорная обработка (SMP), и пользователь не может контролировать параллелизм кода. Расширение Intel OpenMP, называется Кластер OpenMP [2], это реализация на основе сокетов OpenMP который может использовать целый кластер SMP машины; это избавляет пользователя от явного написания кода обмена сообщениями, предоставляя доступ к нескольким хостам через распределенная разделяемая память система. Парадигма OpenMP (отсюда и ее расширение Cluster OpenMP) позволяет пользователю напрямую распараллеливать последовательный код путем встраивания в него набора директив.
  • Второй вариант - использовать Интерфейс передачи сообщений (MPI) API. MPI может рассматривать каждое ядро ​​многоядерных машин как отдельный исполняющий хост, поэтому кластер, скажем, из 10 вычислительных узлов с двухъядерными процессорами будет отображаться как 20 вычислительных узлов, на которых может быть распределено приложение MPI. MPI предлагает пользователю больше контроля над распараллеливанием программы. Недостатком MPI является то, что его не очень легко реализовать, и программист должен иметь определенное представление о системах параллельного моделирования.
  • Для целеустремленного программиста, вероятно, будет наиболее подходящим третий вариант: написать свои собственные процедуры, используя комбинацию потоки и Сокеты TCP / IP для выполнения задачи. Потоки необходимы для обеспечения неблокирующей связи между программами на основе сокетов (связь между программами должна происходить в потоках, так что основной поток не должен ждать завершения связи и может выполнять другие части кода). Эта опция предлагает программисту полный контроль над кодом и устраняет любые накладные расходы, которые могут возникнуть из-за использования библиотек Cluster OpenMP или MPI.

В этой статье представлена ​​концептуальная основа реализации с использованием MPIоснованный на псевдокоде для демонстрации, не ограничиваясь MPI - та же базовая схема может быть реализована с использованием собственных подпрограмм обмена сообщениями.

Вступление

Алгоритм TEBD - хороший кандидат на параллельные вычисления потому что экспоненциальные операторы, используемые для вычисления временной эволюции, факторизуются в рамках разложения Сузуки-Троттера. Подробное описание того, как работает TEBD, представлено в основная статья. Здесь мы касаемся только его параллельной реализации.

Выполнение

Для наших целей мы будем использовать каноническую форму MPS, введенную Гифре Видаль в его оригинальных статьях. Следовательно, запишем функцию состояния в качестве:

Эта функция описывает N-точечная решетка, которую мы хотим вычислить на п разные вычислительные узлы. Предположим, для простоты, что N = 2k * P, где k - целое число. Это означает, что если мы распределяем точки решетки равномерно между вычислительными узлами (самый простой сценарий), каждому вычислительному узлу назначается четное количество точек решетки 2k. При индексировании точек решетки от 0 до N-1 (обратите внимание, что обычная индексация - 1, N) и вычислительных узлов от 0 до P-1, точки решетки будут распределены между узлами следующим образом:

 УЗЕЛ 0: 0, 1, ..., 2k-1 УЗЕЛ 1: 2k, 2k + 1, ..., 4k-1 ... УЗЕЛ m: m * 2k, ..., (m + 1) * 2k - 1 ... УЗЕЛ P-1: (P-1) * 2k, ..., N-1

Используя каноническую форму МПС, определим как «принадлежащий» узлу m, если m * 2k ≤ l ≤ (m + 1) * 2k - 1. Аналогично, мы используем индекс l, чтобы присвоить до определенной точки решетки. Это означает, что и , принадлежат УЗЛУ 0, а также . Параллельная версия TEBD подразумевает, что вычислительные узлы должны обмениваться информацией между собой. Обмениваемой информацией будут матрицы MPS и сингулярные значения, лежащие на границе между соседними вычислительными узлами. Как это делается, будет объяснено ниже.

Алгоритм TEBD делит экспоненциальный оператор, выполняющий эволюцию во времени, на последовательность двухкубитных вентилей вида:

Если установить для постоянной Планка значение 1, эволюция во времени выражается как:

где H = F + G,

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

Первая (четная) развертка

Последовательность вентилей, которые должны применяться в этой развертке:

Уже для вычисления первых ворот обработайте м нужна информация от своего нижнего соседа, м-1. С другой стороны, м ничего не нужно от своего «высшего» соседа, м + 1, потому что у него есть вся информация, необходимая для применения последнего гейта. Итак, лучшая стратегия для м отправить запрос на м-1, откладывая расчет первых ворот на потом, и продолжаем расчет других ворот. Что м действительно называется неблокирующая связь. Давайте рассмотрим это подробнее. Тензоры, участвующие в вычислении первых ворот:[1]

Рекомендации

  1. ^ Гифре Видаль, Эффективное классическое моделирование слегка запутанных квантовых вычислений, СПЛ 91, 147902 (2003)[1][постоянная мертвая ссылка ]