<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OpenMP.ru &#187; dmitry</title>
	<atom:link href="http://openmp.ru/author/dmitry/feed/" rel="self" type="application/rss+xml" />
	<link>http://openmp.ru</link>
	<description>Эффективное программирование</description>
	<lastBuildDate>Wed, 25 May 2011 13:10:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Развитие стандарта MPI</title>
		<link>http://openmp.ru/2009/09/09/%d1%80%d0%b0%d0%b7%d0%b2%d0%b8%d1%82%d0%b8%d0%b5-%d1%81%d1%82%d0%b0%d0%bd%d0%b4%d0%b0%d1%80%d1%82%d0%b0-mpi/</link>
		<comments>http://openmp.ru/2009/09/09/%d1%80%d0%b0%d0%b7%d0%b2%d0%b8%d1%82%d0%b8%d0%b5-%d1%81%d1%82%d0%b0%d0%bd%d0%b4%d0%b0%d1%80%d1%82%d0%b0-mpi/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 16:04:45 +0000</pubDate>
		<dc:creator>dmitry</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://openmp.ru/?p=20</guid>
		<description><![CDATA[Не так давно (4 сентября 2009г) была принята новая версия стандарта MPI-2.2. В основном содержащий косметические изменения по сравнению с предыдущим вариантом (уточнения различных моментов, введение новых типов данных). Полный вариант стандарта  (и всех предыдущих) в формате pdf можно скачать тут: http://www.mpi-forum.org/docs/docs.html Но более интересным представляется MPI-3,  предложения, обсуждаемые комитетом, можно увидеть здесь: http://meetings.mpi-forum.org/MPI_3.0_main_page.php Для [...]]]></description>
			<content:encoded><![CDATA[<p>Не так давно (4 сентября 2009г) была принята новая версия стандарта MPI-2.2. В основном содержащий косметические изменения по сравнению с предыдущим вариантом (уточнения различных моментов, введение новых типов данных).</p>
<p>Полный вариант стандарта  (и всех предыдущих) в формате pdf можно скачать тут:<br />
<a href="http://www.mpi-forum.org/docs/docs.html">http://www.mpi-forum.org/docs/docs.html</a></p>
<p>Но более интересным представляется MPI-3,  предложения, обсуждаемые комитетом, можно увидеть здесь: <a href="http://meetings.mpi-forum.org/MPI_3.0_main_page.php">http://meetings.mpi-forum.org/MPI_3.0_main_page.php</a></p>
<p>Для меня наиболее интересным расширением оказались так называемые Persistent Operations, позволяющие закэшировать соединения для коллективной операции и исключить оверхед при повторном использовании.</p>
]]></content:encoded>
			<wfw:commentRss>http://openmp.ru/2009/09/09/%d1%80%d0%b0%d0%b7%d0%b2%d0%b8%d1%82%d0%b8%d0%b5-%d1%81%d1%82%d0%b0%d0%bd%d0%b4%d0%b0%d1%80%d1%82%d0%b0-mpi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проверка кластерной сети</title>
		<link>http://openmp.ru/2009/04/14/proverka-klasternoj-seti/</link>
		<comments>http://openmp.ru/2009/04/14/proverka-klasternoj-seti/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 21:21:36 +0000</pubDate>
		<dc:creator>dmitry</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Программы]]></category>
		<category><![CDATA[Валидация]]></category>

		<guid isPermaLink="false">http://openmp.ru/?p=15</guid>
		<description><![CDATA[Одна из основных проблем крупных кластеров &#8211; это поддержка работоспособного состояния сетевой системы. Кроме терминального состояния &#8220;коннект отпал&#8221; возможны так же промежуточные варианты &#8211; падения скорости или возникновение задержек. Ситуация усугубляется тем что сложная фабрика может реагировать на битый кабель неочевидно &#8211; скорость может упасть в каком-то сегменте, при определенной передаче между определенными нодами. Поэтому [...]]]></description>
			<content:encoded><![CDATA[<p>Одна из основных проблем крупных кластеров &#8211; это поддержка работоспособного состояния сетевой системы. Кроме терминального состояния &#8220;коннект отпал&#8221; возможны так же промежуточные варианты &#8211; падения скорости или возникновение задержек. Ситуация усугубляется тем что сложная фабрика может реагировать на битый кабель неочевидно &#8211; скорость может упасть в каком-то сегменте, при определенной передаче между определенными нодами. Поэтому иногда стоит устраивать прогоны-тесты сетевой подсистемы с нагрузкой Point-To-Point перебирая все возможные варианты. Это долго, и объемно по анализу, но спокойствие пользователей кластера того стоит.</p>
<p><span id="more-15"></span>Хочу поделится с обществом найденной интересной программой.<br />
Скачать ее можно с Sourceforge: <a title="MPIGraph" href="http://sourceforge.net/projects/mpigraph" target="_blank">http://sourceforge.net/projects/mpigraph</a>. Программа прогоняет пинг-понг тест между всеми ранками по принципу каждый-с-каждым, распараллеливая значительную часть работы. В результате работы получается сводная таблица с намерянными скоростями между ранками.<br />
Кроме того в пакете идет перловый скрипт, который позволяет сделать из текстовой таблички, совершенно не читаемой при количестве обмерянных нод &gt;10, картинку в градациях серого. Каждый пиксель на которой представляет ту же таблицу, чем ярче цвет тем больше скорость, черный цвет &#8211; обрыв линка. Получаем примерно такую картинку на больном кластере:<br />
<a href="http://sharepix.ru/51134zd23" target="_blank"><img src="http://sharepix.ru/thmb/3p4jbr8arya9eafyfetmtopwnboeaa51134/image51134mk.gif" border="0" alt="Send Pattern" /></a><br />
Визуально получается интересно, а чтобы выяснить где именно проседает Bandwidth скрипт генерирует еще и html файл со скриптами. При наведении мышкой на картинку выскакивает всплывающая подсказка с объяснением на какой именно пиксель вы &#8220;наехали&#8221; &#8211; с какого ранка была передача и на какой. Вообщем это уже можно использовать для диагонстики неполадок сети.<br />
Попутно у меня возникла идея о снятии серии таких картинок, и дальнейшего микширования в короткий ролик. Тогда на ролике случайные провисания линков будут видны как шум, а имеющие место проблемы &#8211; постоянными пятнами. Пока что я попробую снять 250 кадров-замеров для 10-секундного ролика. На 64-х нодах это потребует примерно 10*250  примерно 2500 секунд</p>
]]></content:encoded>
			<wfw:commentRss>http://openmp.ru/2009/04/14/proverka-klasternoj-seti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вышел обновленный FFTW-3.2alpha</title>
		<link>http://openmp.ru/2009/01/18/vyshel-obnovlennyj-fftw-32alpha/</link>
		<comments>http://openmp.ru/2009/01/18/vyshel-obnovlennyj-fftw-32alpha/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 21:17:15 +0000</pubDate>
		<dc:creator>dmitry</dc:creator>
				<category><![CDATA[Алгоритмы]]></category>

		<guid isPermaLink="false">http://openmp.ru/?p=12</guid>
		<description><![CDATA[Наконец-то дождались. Судя по сайту fftw.org казалось автор совершенно забросил свое творение, и тут новая версия. В нем анонсирована поддержка MPI FFT преобразования. Теперь можно потихоньку начинать переезжать с 2.1.5. Поскольку это еще альфа, документации пока нет. Но вообщем то по примерам и хидерам можно понять что к чему. Вместо fftw_mpi_create_plan(&#8230;) стало fftw_plan(&#8230;), вместо fftw_one(&#8230;) [...]]]></description>
			<content:encoded><![CDATA[<p>Наконец-то дождались. Судя по сайту <a href="http://www.fftw.org">fftw.org</a> казалось автор совершенно забросил свое творение, и тут новая версия. В нем анонсирована поддержка MPI FFT преобразования. Теперь можно потихоньку начинать переезжать с 2.1.5. Поскольку это еще альфа, документации пока нет. Но вообщем то по примерам и хидерам можно понять что к чему. Вместо fftw_mpi_create_plan(&#8230;) стало fftw_plan(&#8230;), вместо fftw_one(&#8230;) стало fftw_exec(&#8230;). Немного поменялись параметры функций, внимание: требуется инициализация FFTW после MPI_Init() и финализация в конце программы.</p>
<p>В общем работает быстрее 2.1.5 где-то на 20-30%, точные цифры опубликовать к сожалению не могу.</p>
]]></content:encoded>
			<wfw:commentRss>http://openmp.ru/2009/01/18/vyshel-obnovlennyj-fftw-32alpha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Архитектура современных суперкомпьютеров</title>
		<link>http://openmp.ru/2008/09/12/arxitektura-sovremennyx-superkompyuterov/</link>
		<comments>http://openmp.ru/2008/09/12/arxitektura-sovremennyx-superkompyuterov/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 20:24:07 +0000</pubDate>
		<dc:creator>dmitry</dc:creator>
				<category><![CDATA[Распараллеливание]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[SMP]]></category>

		<guid isPermaLink="false">http://openmp.ru/2008/09/12/arxitektura-sovremennyx-superkompyuterov/</guid>
		<description><![CDATA[Эта обзорная статья, в которой я постараюсь избегать подробностей и ненужных деталей, предназначена она в основном для новичков. Есть два подхода при построении современных суперкомпьютеров &#8211; системы с общей памятью и так называемые кластеры. Каждый подход не исключает другого, у каждого подхода есть свои достоиинства и недостатки. Плюс систем с общей памятью &#8211; универсальность модели [...]]]></description>
			<content:encoded><![CDATA[<p>Эта обзорная статья, в которой я постараюсь избегать подробностей и ненужных деталей, предназначена она в основном для новичков.</p>
<p>Есть два подхода при построении современных суперкомпьютеров &#8211; системы с общей памятью и так называемые кластеры. Каждый подход не исключает другого, у каждого подхода есть свои достоиинства и недостатки. Плюс систем с общей памятью &#8211; универсальность модели параллельного ПО, не требующей какого либо дополнительного кода, или не требующей значительных изменений кода. Плюс кластерных систем &#8211; отказоустойчивость и более лучшая масштабируемость. Системы с общей памятью плохо масштабируются при росте числа вычислительных процессоров, кластеры же масштабируются плохо из-за возрастающей сложности сети при добавлении узлов, но это происходит значительно позднее, когда число процессоров измеряется сотнями и даже тысячами. Рассмотрим подробнее оба этих подхода<br />
<span id="more-10"></span><br />
Система с общей памятью, или многопоцессорная система. Возможны два варианта построения такой системы:</p>
<p>а) Все процессоры имеют равноправный доступ к памяти. Память равноудалена от всех процессоров. Это так называемые SMP (Symmetric Multi-Processing), симметричные процессорные системы.</p>
<p><img src="http://openmp.ru/Images/smp.png" alt="" /><br />
Как видно из иллюстрации все процессоры связаны с общей памяти через FSB (Front Side Bus). Эта же шина и является узким местом такой архитектуры, поскольку ее пропускная способность должна удовлетворять запросы каждого процессора, даже если они поступают одновременно.</p>
<p>б) Каждый процессор имеет свою локальную память и более затратный доступ к памяти других процессоров. Это NUMA системы, или системы с неодинаковым доступом к памяти.<br />
В NUMA cистемах каждый процессор имеет локальную память и при правильной привязке процессов к процессорам всегда используется &#8220;ближняя&#8221; память. Доступ же в дальную память, с соответствующим пенальти происходит только при коммуникации процессов. Если привязки процессов нет, то в результате так называемой &#8220;миграции&#8221;, процесс может быть запущен на другом процессоре и работать со своими данными из дальней памяти.<br />
Общая проблема NUMA систем &#8211; большое количество линков, возрастающее при увеличении числа процессоров. Для двухпроцессорной NUMA cистемы достаточно одного линка между процессорами:</p>
<p><img src="http://openmp.ru/Images/numa_2.png" alt="" /><br />
При добавлении процессоров получается более сложная организация:<br />
<img src="http://openmp.ru/Images/numa_4.png" alt="" /><br />
Можете представить, что будет для системы с восемью процессорами. Это будет похоже на паутину <img src='http://openmp.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  С давних времен сложилось так что Intel продвигает SMP системы на рынке, а AMD &#8211; NUMA. В случае Intel-a связь между процессорами сделана на основе QPI, соответственно для AMD это HyperTransport. Фактически при использовании SMP систем каких-то дополнительных сложностей нет. Все процессоры равны и даже миграция (теряется кэш) не сильно влияет на производительность. В случае NUMA уже порой приходится задумываться о привязке процессов/потоков к определенному процессору (или к любому но намертво).</p>
<p>Следущий шаг усложнения кластеры. Кластер &#8211; это набор узлов, обединенных сетью. Узлы могут быть одинаковые (гомогенные кластеры) или разные (гетерогенные кластеры). Обычно кластер имеет как минимум одну головную ноду (head node) и отдельные узлы для файловой системы. Собственно каждый узел (computation node, нода) внутри может быть небольшой SMP или NUMA системой. В этом нет ничего страшного, практически так стоятся все современные суперкомпьютеры, и есть тенденция к увеличению количества процессоров в одной ноде. Между собой ноды связаны сетью, применяется как Gigabit Ethernet (GigE) или более быстрые сети Infiniband (Mellanox, QLogic), Myrinet или другие пропиетарные интерконнекты и сети. Основные два условия к ПО кластера &#8211; обеспечить общий диск между узлами (shared space) и службу удаленного запуска приложений (это может быть telnet, ssh, rshell и т.п). От размера кластера главным образом зависит то, каким будет топология его сети. Небольшие по размеру кластера могут строиться на одном-двух свичах, а для связывания больших кластеров свичи объединяются в несколько уровней. Например, простой вариант, когда количество узловменьше или равно количеству портов у свича:<br />
<img src="http://openmp.ru/Images/topology_1.png" alt="" /><br />
Так строится одна стойка кластера. На рисунке показана только вычислительная сеть. В случае объединения двух стоек, можно воспользоваться одним из портов свича для создания связи свич-свич.<br />
<img src="http://openmp.ru/Images/topology_2.png" alt="" /><br />
При таком варианте обмен между стойками проходит через одину пару портов, что может приводить к замедлению коммуникаций, особенно коллективных.<br />
Дальнейший рост сложности сети приводит к многоуровневым схемам построения свичей:<br />
<img src="http://openmp.ru/Images/topology_3.png" alt="" /></p>
<p>Обычно для крупных систем хватает два уровня. Свичи делятся на Leaf и Spine. Узлы подключаются только к Leaf. Все Leaf связаны между собой через Spine. Вот пример топологии 256-нодового кластера с Infiniband свичем CISCO:<br />
<img src="http://openmp.ru/Images/topology_4.png" alt="" /></p>
<p>Квадратами обозначаются ноды (по 12 шт в одном квадрате). Эти 12 шт подключены к одному листу (Leaf-у), который в свою очередь соединяется с 12-ю Spine. Такой кластер обеспечивает запуск задачи одновременно на 2048 ядрах или 256 нодах при довольно интенсивном межузловом обмене.</p>
<p>Теперь немного о том, как это выглядит. Типичная конструкция, кластер размещается в трех стойках:<br />
<img src="http://openmp.ru/Images/cluster_1.jpg" alt="" /></p>
<p>Свич установлен в дальней стойке сверху. Сверху вниз стойка заполнена нодами. Внизу каждой стойки установлен источник бесперебойного питания. В центральной части установлена login-node и скорее всего синего цвета ноды файловой системы.<br />
Так выглядит серверная комната в яндексе:<br />
<img src="http://openmp.ru/Images/cluster_2.jpg" alt="" /><br />
Это скорее всего кластер кластеров установленный в одном помещении.</p>
]]></content:encoded>
			<wfw:commentRss>http://openmp.ru/2008/09/12/arxitektura-sovremennyx-superkompyuterov/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Обзор способов параллельного программирования</title>
		<link>http://openmp.ru/2008/03/10/obzor-sposobov-parallelnogo-programmirovaniya/</link>
		<comments>http://openmp.ru/2008/03/10/obzor-sposobov-parallelnogo-programmirovaniya/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 21:27:59 +0000</pubDate>
		<dc:creator>dmitry</dc:creator>
				<category><![CDATA[Распараллеливание]]></category>

		<guid isPermaLink="false">http://openmp.ru/2008/03/10/obzor-sposobov-parallelnogo-programmirovaniya/</guid>
		<description><![CDATA[В этой статье подробно рассматриваются различные подходы к параллельному программированию. Наиболее широкоизвестные способы параллельного программирования Threads / Processes OpenMP MPI Исторически сложилось так, что наиболее часто применяемый способ &#8211; это Threads в их различных реинкарнациях. Способ хорош тем что не требует дополнительных библиотек. Чтобы использовать этот вариант, достаточно имеющихся возможностей OC. Обычно используется для скрытия [...]]]></description>
			<content:encoded><![CDATA[<p>В этой статье подробно рассматриваются различные подходы к параллельному программированию.<br />
Наиболее широкоизвестные способы параллельного программирования</p>
<ol>
<li>Threads / Processes</li>
<li>OpenMP</li>
<li>MPI</li>
</ol>
<p>Исторически сложилось так, что наиболее часто применяемый способ &#8211; это Threads в их различных реинкарнациях. Способ хорош тем что не требует дополнительных библиотек. Чтобы использовать этот вариант, достаточно имеющихся возможностей OC. Обычно используется для скрытия от пользователя различных продолжительных операций, чтобы не терять возможность отрисовки GUI в момент ожидания операции. Основное достоинство &#8211; потоки разделяют адресное пространства и принадлежат одному процессу. Поэтому все передачи данных между потоками выполняются максимально быстро. Чаще всего достаточно передать указатель. Синхронизация потоков не затратна и не требует системных вызовов (Syscall) &#8211; долгих операций с переключением контекста. Сюда же можно отнести и многопроцессные программы в самом простейшем виде &#8211; использующие fork() или что-то подобное из системных функций для порождения нового процесса, но применяющее для синхронизации и обмена данными системное API.<br />
<span id="more-8"></span>Для более простого распараллеливания уже существующего кода был придуман OpenMP. Больщинство работы по распараллеливанию и синхронизации здесь переложена на компилятор и его библиотеки. Для распараллеливания достаточно разместить определенные прагмы (#pragma &#8230;) в коде программы. Набор этих прагм описан в стандарте. Плюс такого подхода &#8211; легкость обретения параллелизма программой. Недостатки &#8211; требуется специальный компилятор, низкий уровень параллельности, необходимость следования навязываемой парадигме.</p>
<p>MPI (Message Passing Interface). Эта библиотека, как следует из названия не предназначена для какого либо распараллеливания, однако ее чаще всего применяют для написания параллельных программ на больших кластерах. Именно для написания, так как для применения MPI плохо подходит вариант &#8220;напишем последовательный код, а потом распараллелим&#8221;. В варианте с MPI программа сразу представляет собой N процессов. Это N фиксировано и задается параметром при запуске приложения. Т.е. это полный параллелизм, а библиотека предоставляет примитивы для синхронизации и обмена данными. К плюсам применения MPI относят высокую масштабируемость решения, высокий уровень параллельности и отличная портабельность кода. Основные минусы &#8211; сложности при программировании, относительно высокие затраты на синхронизацию и обмен данными.</p>
<p>Кроме основных трех способов существуют еще и другие малоизвестные, малоприменимые и/или устаревшие. Такие как GlobalArrays &#8211; распределенные структуры данных со скрытым доступом к элементам, PVM &#8211; прародитель MPI&#8230; Может еще чего есть &#8211; напишите мне, если знаете <img src='http://openmp.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Как это выглядит</h3>
<p>Здесь я минимально приведу код, чтобы его можно было охватить глазами. Объяснять как это работает здесь смысла нет, для этого будут отдельные темы.</p>
<p>1. Создание двух процессов вызовом  fork():</p>
<pre class="brush: cpp; title: ; notranslate">int main(){
...
pid = fork();
if (pid == 0) {
// код потомка
else{
// код родителя}
...}</pre>
<p>2. Использование прагм openmp()</p>
<pre class="brush: cpp; title: ; notranslate"> int main(){
...
#pragma parallel for
for (int i=0; i&lt;MaxI; i++)// Параллельный цикл
...

}</pre>
<p>3. Использование MPI</p>
<pre class="brush: cpp; title: ; notranslate">
int main(int* argc, char ** argv){//код идет параллельно начиная с ф-ции main()
//Обязательный пролог - инициализация MPI
MPI_Init(int* argc, char ** argv);
MPI_Comm_size(&amp;np);
MPI_Comm_rank(&amp;myrank);
printf(&quot;I'm process %i, from %i total&quot;, myrank, np);
//обязательный эпилог
MPI_Finalize();
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://openmp.ru/2008/03/10/obzor-sposobov-parallelnogo-programmirovaniya/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

