Исследование подходов к реализации PageRank на языке параллельного программирования Charm++

УДК 004.43

Фролов А.С., Семенов А.С.

АО «Научно-исследовательский центр электронной вычислительной техники», г. Москва, Россия

ИССЛЕДОВАНИЕ ПОДХОДОВ К РЕАЛИЗАЦИИ PAGERANK НА ЯЗЫКЕ ПАРАЛЛЕЛЬНОГО ПРОГРАММИРОВАНИЯ CHARM++

АННОТАЦИЯ

В статье представлены результаты исследования подходов к реализации задачи ранжирования вершин графа - PageRank, на языке параллельного программирования Charm++, основанном на асинхронной модели вычислений с управлением потоком сообщений. Предложены и реализованы три алгоритма PageRank с разной степенью асинхронности, приведены результаты экспериментов по исследованию производительности реализаций PageRank на 36-узловом вычислительном кластере Ангара-К1 на базе коммуникационной сети Ангара. Для сравнения результатов использовалась реализация PageRank из библиотеки Parallel BGL. Результаты исследования показали, что при небольшом количестве узлов (до 32) на задаче PageRank алгоритмы, разработанные на основе принципов асинхронных вычислений и управления потоком сообщений, но использующие механизмы агрегации коротких сообщений, имеют такую же эффективность, как и алгоритм, использующий классическую BSP-модель.

КЛЮЧЕВЫЕ СЛОВА

Обработка графов, языки параллельного программирования, программные модели, PageRank, супер-компьютеры.

Frolov A.S., Semenov A.S.

JSC «Scientific and Research Center of Computer Technolohy», Moscow, Russia

APPROACHES TO IMPLEMENTATION OF PAGERANK IN CHARM++

ABSTRACT

In the paper multiple approaches to implementation of the PageRank algorithms in asynchronous, message-driven parallel programming language Charm++ are presented. The described algorithms are based on the native Charm++ asynchronous model, as well as on the aggregation library (known as TRAM) developed for Charm++ applications. Evaluation results have been obtained on the 36-node HPC cluster - Angara K1. A bulk-synchronous parallel PageRank implementation from Parallel BGL has been chosen as a reference for performance comparison. It has been shown that asynchronous algorithms implemented in Charm++ and using a TRAM-based optimization have almost the same performance as the BSP-based PageRank algorithm implemented in Parallel BGL.

KEYWORDS

Graph processing, parallel programming, computation models, PageRank, supercomputers/ ВВЕДЕНИЕ

Однои из прикладных задач теории графов является ранжирование вершин графа, то есть назначение рангов вершинам графа, в соответствии со структурои графа. Типичным применением даннои задачи является анализ вэб-графа в поисковых системах [1, 2], однако существуют и другие примеры применения [4, 5, 6]. Одним из первых и наиболее известных алгоритмов ранжирования считается PageRank [7], разработанньш для поисковои машины Google. Несмотря на то, что за более чем 15-летнюю историю существования PageRank было выполнено большое количество исследовании алгоритма и его модификации, реализации с использованием различных программных моделеи и технологии, и оптимизации под различные архитектуры вычислительных систем, классическии PageRank продолжает представлять интерес как типовая графовая задача для разработчиков новых программных моделеи и инструментальных средств.

В даннои работе рассматривается асинхронная вычислительная модель с управлением

потоком сообщении и ее реализация в виде языка параллельного программирования Charm++ [8, 9] для суперкомпьютерных комплексов и вычислительных кластерных систем. Программная модель Charm++ значительно отличается от существующих стандартов разработки параллельных программ, основанных на SPMD-модели и модели распределеннои или общеи памяти, MPI [10] или OpenMP [11], а также их комбинации. Асинхронность? заложенная в модели вычислении Charm++? позволяет по-другому выражать алгоритмы и, соответственно, получать принципиально иную организацию вычислительного процесса. Более подробно о существующих асинхронных моделях вычислении можно ознакомится в работе [12].

Алгоритмы анализа графов на Charm++ являются малоисследованнои областью до настоящего времени, в то время как модель Charm++ хорошо подходит для разработки асинхронных графовых алгоритмов в силу следующих причин:

- объектно-ориентированная модель Charm++ позволяет достаточно просто выражать графовые алгоритмы в вершинно-ориентированном стиле (vertex-centric), которьш является одним из наиболее распространенных подходов к работе с графами при решении задач анализа Больших Данных [13, 14];

- динамическая балансировка нагрузки, поддерживаемая в системе времени выполнения (runtime-системе) языка Charm++, позволяет осуществлять автоматическую миграцию объектов между узлами вычислительного кластера, что особенно актуально для графовых задач вследствие их нерегулярности, а также несбалансированности реальных графов (например, scale-free графы с распределением степени вершин по степенному закону).

В даннои работе представлены три различных алгоритма реализации PageRank на Charm++, все три алгоритма являются асинхронными по характеру выполнения модификации рангов вершин, но с различнои степенью асинхронности. Реализации алгоритмов были протестированы на синтетически сгенерированных графах типа RMAT [15]; данныи тип близок к графам, используемым в оценочном тесте Graph500 [16]. Результаты оценочного тестирования получены на вычислительном кластере Ангара-К1 на базе коммуникационнои сети Ангара [17,18].

Далее приводится краткое описание программнои модели Charm++ (раздел 2), описание формальнои постановки задачи PageRank (раздел 3), описание алгоритмов (раздел 4) и анализ результатов оценочного тестирования (раздел 5). В заключении приведены выводы и дальнеишие планы исследовании.

ПРОГРАММНАЯ МОДЕЛЬ CHARM++

Язык параллельного программирования Charm++ является расширением языка C++ и основан на объектно-ориентированнои модели с управлением асинхронным потоком сообщении [8, 9]. Ниже приводятся основные концепции программнои модели Charm++.

Базовым объектом в Charm++ является chare (или chare-объект), обладающии помимо всех своиств объектов в С++ (инкапсулированными данными, множеством публичных и приватных методов и т. п.), интерфеисом из специальных entry-методов, вызовы которых соответствуют передаче данных (т. е. сообщении) между chare-объектами.

Приложение в Charm++ состоит из множества chare-объектов, обменивающихся между собои данными посредством вызовов entry-методов. Кроме того, вызов entry-метода порождает выполнение непосредственно самого метода на том узле, где находится chare-объект, entry-метод которого был вызван, то есть таким образом реализуется концепция управления потоком данных или активных сообщений.

В процессе выполнения entry-метода могут быть изменены только данные, принадлежащие chare-объекту. Одновременно у chare-объекта может выполняться не более одного entry-метода, что позволяет избежать проблемы обеспечения атомарности изменения данных, принадлежащих chare-объекту, и значительно упрощает программирование. Схематически программная модель Charm++ представлена на рисунке 1.

Кроме простых chare-объектов Charm++ имеется возможность создавать массивы chare-объектов. При этом массивы бывают как одномерными, так и многомерными. Использование массивов позволяет создавать большое количество chare-объектов, управлять их распределением по вычислительным узлам, выполнять над ними коллективные операции.

В Charm++ поддерживается автоматическая динамическая балансировка нагрузки на вычислительные узлы, что реализуется на уровне runtime-системы за счет перемещения chare-объектов между вычислительными узлами. Для прикладного программиста данная возможность совершенна прозрачна, так как программная модель Charm++ не специфицирует расположение chare-объектов в вычислительнои системе, и все объекты адресуются в едином адресном пространстве.

Основные концепции модели №агш++ были разработаны почти 20 лет назад в то время, когда массово-параллельные системы (вычислительные кластеры) на основе коммерческих микропроцессоров только набирали популярность. Тем не менее, модель №агш++, вобравшая в себя как принципы dataflow-моделеИ, так и многопоточных (мультитредовых) моделеи вычислении, оказалась достаточно успешной и с момента создания почти не претерпевала изменений.

РЕ О РЕ 1 РЕ 3

Chare А

Chare D[0]

Chare D[l]

Charm++ RTS

Scheduler

Msg Queue

Transport Layer

Chare В

Chare D[2

Chare D[3]

Charm++ RTS

Scheduler

Msg Queue

Transport Layer

Interconnect

Chare С Chare D[4]

Chare D[5]

Charm++ RTS

Transport Layer

Рис. 1. Программная модель Charm++

ПОСТАНОВКА ЗАДАЧИ PAGERANK

Алгоритм PageRank моделирует процесс случайного перемещения ("серфинга") пользователя по страницам вэб-сети, при этом перед каждым новым шагом с заданнои вероятностью выбирается одно из двух деиствии: (1) пользователь с равнои вероятностью выбирает одну из гиперссылок (ребро вэб-графа), принадлежащих текущеи странице (вершине вэб-графа), и переходит на страницу по выбраннои ссылке, или (2) пользователь осуществляет "телепортацию" - перемещение на другую страницу, выбранную случаиным образом из всех существующих страниц вэб-сети. Интуитивно понятно, что при таком перемещении, чем больше страница имеет входящих ссылок, тем большее количество раз на нее будет выполнен переход.

Пусть дан ориентированный графб = (V,E), в котором V- это множество вершин, Е-множество дуг. Тогда ранг вершины ув PageRank вычисляется следующим образом:

где р- вероятность выбора перехода по исходящеи ссылке (0 < р < 1), din(v)- множество смежных с vвершин, имеющих исходящие дуги, указывающие на v, dout(v)- множество смежных с гвершин, на которые указывают исходящие из г дуги. В качестве начального значения рангов выбирается ^

АСИНХРОННЫЕ АЛГОРИТМЫ PAGERANK

Наиболее распространеннои схемои вычисления рангов вершин при реализации алгоритма PageRank является итеративная схема, когда на каждом шаге вычисляется новое значение ранга для каждои вершины, при этом между шагами, как правило выполняется барьерная синхронизация, чтобы обеспечить согласованность вычислении. В нашем подходе мы также использовали итерационную схему вычислении, однако адаптировали ее к асинхроннои модели Charm++.

На рисунке 2 представлен базовьш (или наивныи) асинхронньш алгоритм PageRank на языке Charm++. Алгоритм является итерационным, на каждои итерации происходит пересчет значении рангов всех вершин. Вершины представлены в виде элементов массива chare-объектов класса PageRankVertex, при этом каждыи объект соответствует однои вершине графа. Далее термины вершина и chare-объект можно считать взаимозаменяемыми.

readonly:

g — прокси-ссылка на массив chare-объектов (граф) N — количество вершин

d - вероятность перехода по ребру (damping factor) entry method PageRankVertex:: doPageRankStep_init() PR0id PR new PRnew (1.0 - d)/N end method

entry method PageRank Vertex: :doPageRankStep_update() > вызов update в соседних вершинах for all и G outgoing edges do

g[dest{u)].update{P R0id/d out) end for end method

entry method PageRankVertex::update

PRnew ^ PRnew H- d X T

end method

function MainChare::doPageRank

for г = 0; г < Niters', i г + 1 do

> вызов do PageRank Step_init во всех вершинах графа д [*]. do PageRank St epjinit

> ожидание "тишины"

CkStartQD

> вызов doPageRankStep_update во всех вершинах графа д[*] .doPageRankStep_update

> ожидание "тишины"

CkStartQD(CkCallbackResumeThread()) end for end function

Рис. 2. Базовый алгоритм PageRank на Charm++

В каждой вершине определены два параметраРЯоМиРЯпе№, в которых хранятся значение ранга вершины для предыдущей итерации и частично подсчитанное значение ранга на текущей итерации, соответственно. В начальныи момент времениРЯпе№инициализируется значением^.

Итерации алгоритма состоят из двух фаз. Первая фаза инициируется вызовом entry-метода doPageRankStep_init у всех вершин. Назначение первои фазы в инициализации текущего шага -обновлении значенииРРоМиР^^. Вторая фаза инициируется вызовом doPageRankStep_update также у всех вершин. На второи фазе выполняется асинхронное вычислениеРРпе№у всех вершин. При этом каждая вершина рассылает своим смежным вершинам (по исходящим дугам) значениеРД°тс помощью вызова entry-метода update у соответствующих chare-объектов. Между

dout

фазами, так же как и между итерациями, необходимо выполнение барьернои синхронизации. Для этого используется поддерживаемыи в Charm++ механизм обнаружения "тишины" (вызов CkStartQD).

Очевидным недостатком базового алгоритма PageRank является наличие двух глобальных барьерных синхронизации на каждои итерации, что может привести к слабои масштабируемости алгоритма. Для устранения этои проблемы предлагаются следующие два алгоритма: частично-асинхронныи алгоритм PageRank с подсчетом сообщении и полностью асинхронныи алгоритм.

На рисунке 3 приведен псевдокод частично-асинхронного алгоритма PageRank с подсчетом входящих сообщении, в котором количество глобальных барьеров на одну итерацию сокращено до одного барьера. Основная идея алгоритма - использовать подсчет входящих сообщении (вызовов entry-метода update), и после получения последнего сообщения на даннои итерации обновлять значения локальных переменных вершины. Подразумевается, что все вершины имеют информацию о количестве входящих соседеи (djn), так что для ориентированных графов требуется дополнительная предобработка графа. Для подсчета сообщении используется обратныи счетчик

,vmsg.

readonly:

g - прокси-ссылка на массив chare-объектов

N - количество вершин

d - вероятность перехода по ребру

entry method PageRankVertex::doPageRankStep

О присваивание PRold ссылки на ranko или ranki

PRoid (niter mod 2) ? ranko ' ranki

|> вызов update в соседний вершины

for all и e outgoing edges do

g [dest

end for

end method

entry method PageRank Vertex: :update

[> присваивание PRneu> ссылки на ranko или ranki

PRnew (niter mod 2) ? ranki : ranko

PRnew ^ PRnew d x V

П-msg * Пцпзд ~ 1

if nmsg = 0 then

Ппгэд d-in

niter niter 1

D> Присваивание PRnew ссылки на ranko или ranki

PRnew +4 (niter mod 2) ? ranki : ranko

PRnew - (1.0-d) ¡N

end if

end method

function TestDriver::doPageRank

for i = 0; i < Niters ]i *- i + 1 do

О вызов doPageRank Step во всех вершинах i pa фа

g [ *] .doPage RankSt ep

> охеидание "тишины"

CkStartQD

end for

end function

Рис. 3. Алгоритм PageRank с подсчетом сообщений на Charm++

readonly:

g - прокси-ссылка на массив cliare-объектов (граф) N - количество вершин

d - вероятноств перехода по ребру

> инициализация PRcur и iter в каждой вершине PRCur 1.0/N, iter <r- 0

> вызов update в соседних вершинах for all и £ outgoing edges do

g[dest{u)].update(0, PRCUr/dout) end for

iter iter + 1 end method

entry method PageRank Vertex:: update!?', r)

PR[i].nmsg PR[i].nmsg + 1 PR[i].pr PR[i}.pr + d x r while PR[iter].nm3g = d;/n do

PRcur = (1.0 -d)/N + PR{iter].pr if iter + 1 < Niters then

> вызов update в соседних вершинах for all и £ outgoing edges do

g[dest(u)].update(i + 1, PRCUr/dout) end for

iter iter + 1 end if end while end method

function MainChare::DOPageRank

> вызов doPageRank во всех вершинах g[*].doPageRank

end function

Рис. 4. Полностью асинхронный алгоритм PageRank на Charm++

Также необходимо обратить внимание, что работа с переменными хранящими предыдущее и текущее (обновляемое) значения рангов, выполняется через ссылки (РДоМи PRnew), это необходимо для того, чтобы сохранить консистентность этих значении в случае рассинхронизации выполнения методов doPageRank и update.

На рисунке 4 представлен еще одна модификация алгоритма PageRank с полностью асинхронным выполнением обновлении рангов вершин, то есть между итерациями PageRank отсутствует какая-либо синхронизация. Для этого в каждую вершину добавлена ассоциативная таблицаРД[ ], адресуемая по номеру итерации, а в вызов entry-метода update добавлен номер итерации (i), в рамках которои он выполняется.

Каждая запись РР[ ]содержит значение ранга вершины на даннои итерации рг, которое может быть вычисленным или быть в стадии вычисления, и количество сообщении nmsg, полученных на даннои итерации от соседних вершин. Когда все сообщения были доставлены для текущеи итерации (т. е. PR[iter].nmsg = din), то вершина "переходит" на следующую итерацию (iter = iter + 1), рассылает новые значения своим соседям и ожидает новую порцию сообщении и т. д. Необходимо отметить, что в вершину могут приходить сообщения с разными i, и тогда информация о них будет попадать в разные записи PR [ ].

Экспериментальные результаты

В качестве тестовои платформы использовался вычислительным кластер Ангара-К1 с отечественнои коммуникационнои сетью Ангара. Конфигурация Ангара-К1 включает: (1) 24 двухпроцессорных узла с 6-ядерными процессорами Intel Xeon E5-2630, (2) 12 однопроцессорных узла с 8-ядерными Intel Xeon E5-2660. Все узлы имеют по 64 ГБ оперативнои памяти. Коммуникационная сеть - Ангара с топологиеи 3D-тор (3x3x4).

Для тестирования масштабируемости алгоритмов использовались ориентированные синтетические RMAT графы различного размера (параметр k=16). В качестве генератора использовался соответствующии код из тестового пакета Graph500. Количество итерации PageRank равно 3.

На рисунке 5 приведены графики зависимостеи времени выполнения PageRank от количества используемых узлов кластера (количество используемых ядер в узле было всегда равным 8) при постоянном размере графа (сильная масштабируемость). Таким образом, число вершин графа RMAT-s составляет2х.

Из графиков видно, что, во-первых, базовыи алгоритм PageRank и алгоритм с подсчетом сообщении показывают практически одинаковое время выполнения. С однои стороны, это говорит о достаточно эффективнои реализации механизма обнаружения тишины в Charm++, но, с другои стороны, максимальное количество узлов достаточно мало и негативныи эффект от выполнения барьернои синхронизации не заметен. Во-вторых, полностью асинхронныи алгоритм PageRank имеет более высокую производительность по сравнению с базовым алгоритмом: так, для графа RMAT-20, на одном узле отношение двух алгоритмов составляет 2,5 раза, а на 16 узлах - 3,1 раза. Данное ускорение может быть объяснено несбалансированностью вычислении в рамках однои итерации при выполнении базового алгоритма PageRank (также как и алгоритма с подсчетом сообщении), в то время как в асинхронном алгоритме данная несбалансированность не имеет сильного значения, так как итерации выполняются с перекрытием друг относительно друга.

Также была выполнена реализация базового алгоритма с использованием библиотеки агрегации сообщении TRAM [19], разработаннои для Charm++ программ. Применение этои библиотеки позволяет отправлять короткие сообщения, используя механизмы агрегации и программнои маршрутизации сообщении в заданнои виртуальнои топологии (поддерживаются многомерные решетки), в узлах которои находятся процессы системы поддержки выполнения Charm++ (или, что практически одно и то же, MPI-процессы).

Как видно из рисунка 5 использование библиотеки TRAM для реализации базового алгоритма позволило значительно сократить время выполнения алгоритма по сравнению с нативнои Charm++ реализации: для графа RMAT-20 на одном узле прирост производительности составил 4,22 раза, а на 16 узлах - 5,7 раза. Таким образом, реализация базового алгоритма PageRank с использованием библиотеки TRAM оказалась наиболее эффективнои среди исследуемых реализации PageRank на Charm++.

Рис. 5. Время выполнения PageRank на кластере Ангара-К1 для графов RMAT-20 (а), RMAT-22 (б), RMAT-24 (в),

RMAT-26 (г). Режим сильной масштабируемости

Для сравнения были получены результаты выполнения алгоритма PageRank, реализованного в библиотеке Parallel Boost Graph Library (PBGL) [20], основанной на синхронной модели вычислении Bulk-Synchronous Parallel [21]. Как видно из графиков, что PBGL и TRAM реализации PageRank имеет практически одинаковое время выполнения, что объясняется схожими принципами их работы: агрегация коротких сообщении и совмещение вычислении и передачи данных по сети.

Выколотые точки на графиках (графы RMAT-24 и RMAT-26) соответствуют случаям, когда выполнение алгоритмов невозможно из-за нехватки памяти. При этом в асинхронных алгоритмах проблема нехватки памяти особенно актуальна, так как для таких алгоритмов характерно резкое возрастание количества сообщении и, соответственно, аллокация больших участков в памяти (проблема взрывного параллелизма).

chärm-pagerank (naive) —9—

charm-pagerank (count) —i

charm-pagerank

tram-pagerank (naive) ——

pbgl-pagierank X

pagerank(n=16, ppn=8), vertical.nicevt.ru/charm-6.7.0-patch, ws

chärm-pagerank (naive) —6— chärm-pagerank (count) —•— charm-pagerank (async) tram-pagerank (naive) —— pbgl-pagerank X

pagerank(n=18, ppn=8), vertical.nicevt.ru/charm-6.7.0-patch, ws

charm-pagerank (naive) charm-pagerank (count) charm-pagerank (async) tram-pagerank (naive) pbgl-pagerank

nodes nodes

pagerank(n=20, ppn=8), vertical.nicevt.ru/charm-6.7.0-patch, ws

charm-pagerank (naive) charm-pagerank (count) charm-pagerank (async) tram-pagerank (naive) pbgl-pagerank

nodes

Рис. 6. Время выполнения PageRank на кластере Ангара-К1 для графов RMAT-16 (а), RMAT-18 (б) и RMAT-20 (в).

Режим слабой масштабируемости

На рисунке 6 приведены графики зависимости времени выполнения PageRank от количества используемых узлов кластера (количество используемых ядер в узле - 8) при размере графа с пропорциональным увеличением от числа узлов (слабая масштабируемость). Таким образом, количество вершин графа RMAT-s составляет25*8*п, где п- количество используемых узлов.

Как видно из графиков на рисунке 6, все эффекты, наблюдаемые в случае сильного масштабирования, проявляются и при слабом масштабировании. Отличие лишь в несколько большеи разнице в производительности между асинхронным PageRank, реализованном с использованием TRAM, и реализациеи на PBGL (особенно для графа RMAT-18).

Заключение

В статье представлены три асинхронных алгоритма PageRank, реализованных на языке параллельного программирования Charm++, а также с использованием библиотеки TRAM. Исследование производительности алгоритмов проводилось на 36-узловом вычислительном кластере Ангара-К1 на базе коммуникационнои сети Ангара.

Результаты экспериментов показали, что среди реализации? выполненных на Charm++ наиболее эффективным оказался полностью асинхронныи алгоритм, в котором итерации PageRank выполняются одновременно. Применение библиотеки TRAM для реализации базового алгоритма позволило получить почти 5-кратное увеличение производительности. В сравнении с

существующеи реализациеи PageRank в параллельнои библиотеке PBGL реализация PageRank на TRAM показывает незначительно большую эффективность.

В даннои работе на примере задачи PageRank продемонстировано, что с помощью асинхроннои модели вычислении Charm++ (с использованием TRAM) возможно разрабатывать и реализовывать графовые алгоритмы в вершинно-ориентированном стиле (т. е. стиле vertex-centric), при этом производительность таких алгоритмом сопоставима с производительностью решении на базе традиционных моделеи вычислении (в даннои работе - BSP модели и ее реализации в библиотеке PBGL).

В будущем предполагается сравнение Charm++ с другими системами, поддерживающими асинхронную модель вычислении, такими как AM++ (ActivePebbles) [22], Grappa [23], HPX [24], а также исследование масштабируемости алгоритмов на графах большего размера (RMAT-30 и больше), для чего потребуются кластерные системы с большим числом узлов.

Работа выполнена при поддержке гранта РФФИ№15-07-09368.

Литература

1. Brin S., Page L. Reprint of: The anatomy of a large-scale hypertextual web search engine //Computer networks. - 2012. - Т. 56. - №. 18. - С. 3825-3833.

2. Langville A. N., Meyer C. D. Google's PageRank and beyond: The science of search engine rankings. - Princeton University Press, 2011.

3. Suri P. R., Taneja H. An integrated ranking algorithm for efficient information computing in social networks //arXiv preprint arXiv:1204.1413. - 2012.

4. Sharma D. et al. A ranking algorithm for online social network search //Proceedings of the 6th ACM India Computing Convention. - ACM, 2013. - С. 17.

5. Winter C. et al. Google goes cancer: improving outcome prediction for cancer patients by network-based ranking of marker genes //PLoS Comput Biol. - 2012. - Т. 8. - №. 5..

6. Morrison J. L. et al. GeneRank: using search engine technology for the analysis of microarray experiments //BMC bioinformatics. - 2005. - Т. 6. - №. 1. - С. 1.

7. Page L. et al. The PageRank citation ranking: bringing order to the web. - 1999.

8. Kale L. V., Krishnan S. CHARM++: a portable concurrent object oriented system based on C++. - ACM, 1993. - Т. 28. - №. 10. - С. 91-108.

9. Acun B. et al. Parallel programming with migratable objects: charm++ in practice //SC14: International Conference for High Performance Computing, Networking, Storage and Analysis. - IEEE, 2014. - С. 647-658.

10. Official MPI Forum web-site, http: //mpi-forum.org

11. Official OpenMP web-site, http://openmp.org

12. Фролов А.С., Семенов А.С., Марков А.С. Обзор инструментальных средств разработки параллельных графовых приложений для суперкомпьютерных комплексов // «Вычислительные нанотехнологии». - №4. - 2015.

13. McCune R. R., Weninger T., Madey G. Thinking like a vertex: a survey of vertex-centric frameworks for large-scale distributed graph processing //ACM Computing Surveys (CSUR). - 2015. - Т. 48. - №. 2. - С. 25.

14. Malewicz G. et al. Pregel: a system for large-scale graph processing //Proceedings of the 2010 ACM SIGMOD International Conference on Management of data. - ACM, 2010. - С. 135-146.

15. Seshadhri C., Pinar A., Kolda T. G. An in-depth study of stochastic Kronecker graphs //2011 IEEE 11th International Conference on Data Mining. - IEEE, 2011. - С. 587-596.

16. Murphy R. C. et al. Introducing the graph 500 //Cray User's Group (CUG). - 2010.

17. Симонов А.С., Жабин И.А., Макагон Д.В. Разработка межузловой коммуникационной сети с топологией «многомерный тор» и поддержкой глобально адресуемой памяти для перспективных отечественных суперкомпьютеров. // Научно-техническая конференция «Перспективные направления развития вычислительной техники», ОАО «НИЦЭВТ», 2011.

18. Симонов А.С., Макагон Д.В., Жабин И.А., Щербак А.Н., Сыромятников Е.Л., Поляков Д.А. Первое поколение высокоскоростной коммуникационной сети «Ангара» // Наукоемкие технологии. — 2014. — Т. 15, No1. — С. 21-28.

19. Wesolowski L. et al. Tram: Optimizing fine-grained communication with topological routing and aggregation of messages //2014 43rd International Conference on Parallel Processing. - IEEE, 2014. - С. 211-220.

20. Gregor D., Lumsdaine A. The parallel BGL: A generic library for distributed graph computations //Parallel Object-Oriented Scientific Computing (POOSc). - 2005. - Т. 2. - С. 1-18.

21. Cheatham T. et al. Bulk synchronous parallel computing—a paradigm for transportable software //Tools and Environments for Parallel and Distributed Systems. - Springer US, 1996. - С. 61-76.

22. Willcock J. J. et al. Active pebbles: parallel programming for data-driven applications //Proceedings of the international conference on Supercomputing. - ACM, 2011. - С. 235-244.

23. Nelson J. et al. Grappa: A latency-tolerant runtime for large-scale irregular applications //International Workshop on Rack-Scale Computing (WRSC w/EuroSys). - 2014.

24. Kaiser H., Brodowicz M., Sterling T. Parallex an advanced parallel execution model for scaling-impaired applications //2009 International Conference on Parallel Processing Workshops. - IEEE, 2009. - С. 394-401.

References

1. Brin S., Page L. Reprint of: The anatomy of a large-scale hypertextual web search engine //Computer networks. - 2012. - Т. 56. - №. 18. - С. 3825-3833.

2. Langville A. N., Meyer C. D. Google's PageRank and beyond: The science of search engine rankings. - Princeton University Press, 2011.