<?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>Блоги &#187; ialexander</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/author/ialexander/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/ru-ru/blogs</link>
	<description></description>
	<lastBuildDate>Thu, 24 May 2012 12:16:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Классификация грид-систем</title>
		<link>http://software.intel.com/ru-ru/blogs/2010/02/09/2003069/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2010/02/09/2003069/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 13:16:08 +0000</pubDate>
		<dc:creator>ialexander</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[грид-вычисления]]></category>

		<guid isPermaLink="false">http://origin-software.intel.com/ru-ru/blogs/2010/02/09/2003069/</guid>
		<description><![CDATA[Понятие "грид" относится к тому классу понятий, где сколько людей, столько и мнений. Тем не менее, авторы этого понятия Я. Фостер и К. Кессельман потрудились дать точное определение: "Грид - согласованная, открытая и стандартизированная среда, которая обеспечивает гибкое, безопасное, скоординированное разделение ресурсов в рамках виртуальной организации". Что скрывается за этим формальным определением?]]></description>
			<content:encoded><![CDATA[<p>Понятие "грид" относится к тому классу понятий, где "сколько людей, столько и мнений". Тем не менее, авторы этого понятия Я. Фостер и К. Кессельман потрудились дать точное определение:</p>
<blockquote><p>Грид - согласованная, открытая и стандартизированная среда, которая обеспечивает гибкое, безопасное, скоординированное разделение ресурсов в рамках виртуальной организации.</p></blockquote>
<p>Гриды в первую очередь характеризуются географической распределенностью вычисляемых ресурсов системы. Предоставляемая ими возможность объединять в рамках одной системы огромные вычислительные мощности делает интересным их использование для высокопроизводительных вычислений (HPC). В отличие от других систем HPC, таких как многопроцессорные системы с общей памятью и вычислительные кластеры, грид-системы отличаются высокой латентностью передачи данных, что накладывает определенный отпечаток на вычислительный процесс.</p>
<p>Можно выделить 2 типа грид-систем:</p>
<ol>
<li>Гриды рабочих станций, объединяющие обычные домашние и офисные компьютеры и использующие их во время простоя.</li>
<li>Сервисные гриды, объединящие специально выделенные машины и использующие их в монопольном режиме.</li>
</ol>
<p>Для создания гридов рабочих станций используется следующее программное обеспечение:</p>
<ol>
<li>системы добровольных вычислений: <a href="http://boinc.berkeley.edu/">BOINC</a>, <a href="http://www.xwhep.org/">XWHEP</a>, <a href="http://folding.stanford.edu/">Folding@home</a></li>
<li>системы внутрикорпоративных вычислений: <a href="http://www.cs.wisc.edu/condor/">Condor</a></li>
</ol>
<p>Для сервисных гридов в свою очередь используется следующее промежуточное программное обеспечение:</p>
<ol>
<li><a href="http://glite.web.cern.ch/glite/">gLite</a></li>
<li><a href="http://www.globus.org/">Globut Toolkit</a></li>
<li><a href="http://www.unicore.eu/">Unicore</a></li>
</ol>
<p>В России создано несколько крупных грид-систем: <a href="http://rus.egee-rdig.ru/">RDIG</a>, <a href="http://www.jscc.ru/rispinfo.shtml">РИСП</a>, <a href="http://skif-grid.botik.ru/">СКИФ-ГРИД</a> (Unicore). Также наша страна принимает участие в работе и международных, европейских гридов: <a href="http://public.eu-egee.org/">EGEE</a> (gLite), <a href="http://www.deisa.eu/">DEISA</a>.</p>
<p>Ссылки:</p>
<p><a href="http://www.gridclub.ru/">gridclub.ru</a> - сайт, посвященный грид-вычислениям</p>
<p>По мотивам лекции "Введение в распределенные и параллельные вычисления", прочитанной <a href="http://dcs.isa.ru/posypkin/">М.А. Посыпкиным</a> 25 января 2010 г. в <a href="http://www.miit.ru/">МИИТ</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2010/02/09/2003069/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Использование суперкомпьютеров в промышленности</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/11/18/2002566/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/18/2002566/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 07:10:50 +0000</pubDate>
		<dc:creator>ialexander</dc:creator>
				<category><![CDATA[Академическое сообщество]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>

		<guid isPermaLink="false">http://origin-software.intel.com/ru-ru/blogs/2009/11/18/2002566/</guid>
		<description><![CDATA[В соседней записи Долой летнее время обсуждается пара вопросов поднятых Дмитрием Медведевым в своем Послании федеральному собранию. В этом послании поднимается и другая более близкая нам тема об использовании суперкмопьютеров: И, наконец, пятая приоритетная задача - развитие стратегических и информационных технологий. В России должен быть в полном объёме задействован потенциал суперкомпьютеров, суперкомпьютерных систем, которые объединены [...]]]></description>
			<content:encoded><![CDATA[<p>В соседней записи <a href="http://software.intel.com/ru-ru/blogs/2009/11/13/2002532/">Долой летнее время</a> обсуждается пара вопросов поднятых Дмитрием Медведевым в своем <a href="http://www.kremlin.ru/transcripts/5979">Послании федеральному собранию</a>. В этом послании поднимается и другая более близкая нам тема об использовании суперкмопьютеров:</p>
<blockquote><p>И, наконец, пятая приоритетная задача - развитие стратегических и информационных технологий. В России должен быть в полном объёме задействован потенциал суперкомпьютеров, суперкомпьютерных систем, которые объединены высокоскоростными каналами передачи данных. С их помощью уже в пятилетней перспективе станет возможным проектирование новейших самолётов и космических аппаратов, автомобилей и ядерных реакторов. Ведь сложная техника, не прошедшая суперкомпьютерного моделирования, что называется, не положенная в цифру, через несколько лет просто не будет востребована рынком. И для завоевания здесь конкурентных позиций мы обязаны настойчиво работать.</p></blockquote>
<p>Как это ни печально осознавать, но использование суперкомпьютеров в нашей промышленности находится на очень низком уровне. Медведев уже не в первый раз говорит об этом, но особых подвижек пока нет.</p>
<p>Можно говорить о том, что наш наши КБ и НИИ безинициативны и не делают использовать доступные вычислительные мощности. Но вот вам обратный пример: <a href="http://www.jinr.ru/default.asp?language=rus">Институт объединенных ядерных исследований</a> при выполнении зарубежных заказов по проектированию циклотронов был вынужден использовать обычный персональный компьютер, неизвестно, чем бы завершились проекты, но ребятам удалось использовать видеоадаптер для значительного ускорения вычислений в рамках проекта "CBDA: Cyclotron Beam Dynamics Analysis". С другой стороны университетские кластеры просто простаивают. К примеру, кластер МГТУ им. Баумана загружен всего на несколько процентов, по словам инсайдеров.</p>
<p>В России есть отдельные проекты, которые пытаются решить эту задачу, например, <a href="http://caebeans.susu.ru/">CAEBeans</a> под руководством проф. Л.Б. Соколинского, ЮУрГУ. Другой пример: проект <a href="http://dcs.isa.ru/wiki/staff/taras/projects/mathcloud">MathCloud</a> Алексея Тарасова из ИСА РАН.</p>
<p>Но все эти проекты как-то разрознены, нет единой системы, они как капля в море и ситуации не меняют. Может быть, для прорыва в этой области требуется некоторая критическая масса таких проектов. А может уже сегодня сильные мира сего могут предпринять шаги по созданию системы, объединяющией проекты, созданию единого информационного пространства в этой области. Ведь не секрет, что представители промышленности не слишком часто посещают научные конференции по параллельным вычислениям и не могут знать о такого рода проектах, и что, вообще, ведутся работы.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/18/2002566/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Первый взгляд на Go</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/11/17/go/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/17/go/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 09:57:46 +0000</pubDate>
		<dc:creator>ialexander</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Язык программирования Go]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/17/go/</guid>
		<description><![CDATA[Итак, что интересного, хорошего и плохого нашел я в этом языке, просидев с ним несколько дней?]]></description>
			<content:encoded><![CDATA[<p>Выход Go похож на дурную шутку. Сначала Google выпустил браузер Chrome, который работает только под Windows, теперь новый язык Go, компилятор которого есть под Linux и Mac OS X, но никак не под Windows. Оно, конечно, понятно, что есть хорошее оправдание - команда маленькая, и все охватить не могут, но тем не менее факт остается фактом.<br />
Выход этого языка - плохая новость для Microsoft, отнюдь не из-за того, что Google проигнорировал Windows, но из-за того, что он начал вторжение в святая святых MS - разработка средств разработки. Теперь Балмеру, чтобы исправить ситуацию придется прыгать в 2 раза выше и кричать в 2 раза чаще: "Developers! Developers! Developers!".<br />
Итак, что интересного, хорошего и плохого нашел я в этом языке, просидев с ним несколько дней.</p>
<p>Первое, что бросается в глаза, в этом якобы Си-подобном языке, это объявления переменных и типов. Здесь добавлены новые ключевые слова и все перевернуто с ног на голову, команда Go, утверждает, что так удобнее. Но поначалу такое нововведение вызывает только раздражение. Теперь, чтобы объявить переменную i типа int, придется выдать конструкцию:</p>
<blockquote>
<pre>var i int;</pre>
</blockquote>
<p>Другие примеры:</p>
<blockquote>
<pre>var p *int; //указатель
var str string; //строка</pre>
</blockquote>
<p>Да, да все верно. В Go строки поддерживаются самим языком, мало того, как и в C# они неизменяемые. А значит, при работе с ними придется быть крайне внимательным, чтобы не наплодить кучу строковых объектов.</p>
<p>Арифметике указателей, напротив, придется сказать "до свидания". Гуглы решили, что так безопаснее, да еще и проще будет реализовать сборщик мусора. Ага, в Go появилось и это чудо. Гугл декларирует Go как быстрый язык поддерживающий параллельное программирование. Как сборщик мусора будет сочетаться с этими декларациями? Весьма, весьма интересно. Одно правда, для ряда параллельных задач сборщик мусора упрощает дело. Бывает так, что приходится писать пользовательские менеджеры памяти, только, чтобы память можно было освобождать в условиях общей памяти и многопоточности. С другой стороны, сборщик мусора может серьезно сказаться на эффективности. Задачи дискретной оптимизации, к примеру, весьма активно используют память и сборщик мусора тут может сыграть дурную шутку. Но пока это лишь предположения.</p>
<p>Разработчики Go так и не смогли обойтись без синтаксического сахара в объявлениях переменных, следующие 2 объявления равнозначны:</p>
<blockquote>
<pre>var i int = 0;
i := int(0);</pre>
</blockquote>
<p>Оператор := позволяет задавать тип переменной, исходя из типа присваиваемого значения.</p>
<p>Для констант также не нужно задавать тип константы, он определяется по типу значения:</p>
<blockquote>
<pre>const NewLine = "\n";</pre>
</blockquote>
<p>Можно объединить определения нескольких констант следующим образом:</p>
<blockquote>
<pre>const (
	NewLine = "\n";
	MagicNumber = int(7);
)</pre>
</blockquote>
<p>У языка Go настоящая беда с точками с запятой, правило где их нужно ставить, а где необязательно весьма запутаны, так, что я предпочитаю ставить и везде, так спокойнее.</p>
<p>Функции в Go достаточно интересны. Они выдерживают общий стиль объявления новых типов, и на этот раз ключевым словом является func:</p>
<blockquote>
<pre>func lisa(grade int) {...} // по правилам Си: void foo(int i) {...}
func bart(shorts string) string {...} //const char *bart(const char *str) {...}</pre>
</blockquote>
<p>Все это конечно замечательно, но есть одно дополнение, которое позволит обходится без boost::tuple в качестве возвращаемого значения:</p>
<blockquote>
<pre>func homer(beer string) (int, double) {...} //аналог в Си: эээ...
		//int homer(const char *beer, double *result) {...}</pre>
</blockquote>
<p>В общем, несколько возвращаемых значений не новинка и поддерживаются в том же Руби, но какого их нет в таком вроде новом языке как C#? И в C++ их тоже не хватает. Стандартная ситуация: возврат кода ошибки и основного результата.</p>
<p>Пожалуй не буду дальше испытывать ваше терпение, и некоторые более интересные типы вроде исключений и определений новых типов я оставлю до следующей записи.<br />
P.S.:Для тех, кто как и я страдает без подсветки синтаксиса в Go, могу предложить файл определений для библиотеки <a href="http://projects.gnome.org/gtksourceview/">GtkSourceView-2.x</a>, если вы скопируете его в папку /usr/share/gtksourceview-2.0/language-specs/ (путь может меняться в зависимости от дистрибутива Linux), то такие приложения как gedit, будут поддерживать подсветку синтаксиса Go: <a href="http://software.intel.com/file/23751">go.lang</a>.</p>
<ul>
<li><a href="http://golang.org">Сайт языка программирования Go</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/17/go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сверхлинейное ускорение</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/11/04/2002434/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/04/2002434/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 12:29:54 +0000</pubDate>
		<dc:creator>ialexander</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/04/2002434/</guid>
		<description><![CDATA[Мы привыкли слышать утверждения, что параллельные методы показывают плохую эффективность, а хорошие последовательные алгоритмы плохо распараллеливаются. Доказываем обратное на примере задачи коммивояжёра с отсечением по методу ветвей и границ.]]></description>
			<content:encoded><![CDATA[<p>Неприятной особенностью многих задач дискретной оптимизации является то, что точное решение можно получить только перебором. А другой особенностью является то, что количество решений растет экспоненциально с размером задачи, и задачу достаточно небольшой размерности при полном переборе можно решать дольше времени жизни вселенной. К примеру, число решений задачи коммивояжёра с 60 городами больше, чем число молекул во вселенной, а это считается весьма небольшой задачей. Поэтому единственным возможным вариантом найти оптимальное решение является ограниченный перебор.<br />
Одним из таких алгоритмов является метод ветвей и границ. Его ключевой идеей является разбиение по некоторым формальным критериям множества решений на подмножества, затем делается попытка доказать, что в конкретном подмножестве не содержится оптимальных решений. Как правило, это делается с помощью процедуры граничной оценки подмножества, которая дает оценку наилучшего возможного решения подмножества и сравнение полученного значения с рекордом - лучшего известного решения. В случае, если удастся доказать, что подмножество не содержит оптимальных решений, оно удаляется из дальнейшего рассмотрения, "отсеивается". В противном случае само подмножество разбивается, и для каждого нового подмножества применяется процедура оценки. Ветвление продолжается до тех пор пока все подмножества не будут отсеяны; если в подмножестве остается только одно решение, и оно лучше рекорда, последний обновляется новым полученным значением.</p>
<p>Рекорд, оставшийся после отсева всех подмножеств, является оптимальным решением.<br />
Первоначальное значение рекорда может быть получено с помощью какой-нибудь эвристики (генетические алгоритмы, алгоритмы муравьиных колоний и др.).<br />
Критически важными здесь являются качество процедуры оценки и значение рекорда. Лучше всего, если оно равно оптимальному решению, в этом случае отсев будет происходить максимально быстро.</p>
<p>Итак после краткого введения в специфику решаемых задач рассмотрим результаты одного вычислительного эксперимента решения задачи коммивояжёра на МВС-100К:</p>
<table border="1" cellspacing="0">
<tbody>
<tr>
<td>Число  Процессоров</td>
<td>Время (сек)</td>
<td>Ускорение</td>
<td>Число  ветвлений</td>
</tr>
<tr>
<td>1</td>
<td>664,83</td>
<td>1</td>
<td>3299763</td>
</tr>
<tr>
<td>2</td>
<td>96,9</td>
<td>6,86</td>
<td>1331230</td>
</tr>
<tr>
<td>4</td>
<td>34,49</td>
<td>19,28</td>
<td>900641</td>
</tr>
<tr>
<td>8</td>
<td>42,03</td>
<td>15,82</td>
<td>1939826</td>
</tr>
<tr>
<td>16</td>
<td>26,14</td>
<td>25,43</td>
<td>2374063</td>
</tr>
<tr>
<td>32</td>
<td>21,81</td>
<td>30,48</td>
<td>3225846</td>
</tr>
<tr>
<td>48</td>
<td>8,52</td>
<td>78,03</td>
<td>2038415</td>
</tr>
<tr>
<td>64</td>
<td>4,11</td>
<td>161,76</td>
<td>1325692</td>
</tr>
<tr>
<td>96</td>
<td>2,9</td>
<td>229,25</td>
<td>1194724</td>
</tr>
</tbody>
</table>
<p>В столбце "Ускорение" задано ускорение по сравнению с последовательным (однопроцессорном) вариантом. Как легко заметить, практически во всех строках мы наблюдаем сверхлинейное ускорение, кроме строки с числом процессоров равным 32. Мало того, здесь наблюдается еще одна интересная аномалия: задача на 4-х процессорах решается быстрее, чем на 8. Объяснение этой аналомалии мне уже приходилось давать:</p>
<blockquote><p>Процесс решения задачи методом ветвей и  границ можно представить как  обход дерева, в каждой вершине  которого по соотношению между оценкой и рекордом определяется, подлежит ли эта вершина дальнейшему ветвлению. Очевидно, что число ветвлений (вершин дерева ветвления) зависит от того, в каком порядке обходится это дерево. Можно очень быстро получить оптимальное или близкое к нему решение и затем уже отсеять оставшиеся вершины. При этом число ветвлений сильно зависит от числа используемых процессоров, определяющего распределение множества вершин между собой и, следовательно, порядок обхода дерева. Чтобы нивелировать влияние порядка обхода, перед началом ветвлений рекорду присваиваем оптимальное значение. Тогда порядок обхода дерева становится несущественным, так как оптимальное решение уже известно, и производится лишь отсев вершин (т.е. доказательство оптимальности).</p></blockquote>
<p>В цитате еще раз напоминается о важности хорошего рекорда. Похоже, что в варианте с 4 процессорами кости легли так, что хороший рекорд очень быстро находится. В этом легко убедиться посмотрев на столбец "Число ветвлений". В варианте с 4 процессорами ветвлений меньше миллиона, в то время как в варианте с 8 процессорами их почти 2 миллиона.</p>
<p><em>UPDATE</em>: В следующей таблице представлены результаты эксперимента с заранее заданным рекордом, равным оптимальному решению, т.е. эффект быстрого нахождения хорошего рекорда нивелирован.</p>
<table border="1" cellspacing="0">
<tbody>
<tr>
<td>Число  процессоров</td>
<td>Время (сек)</td>
<td>Ускорение</td>
</tr>
<tr>
<td>1</td>
<td>56,53</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>28,31</td>
<td>2</td>
</tr>
<tr>
<td>4</td>
<td>14,14</td>
<td>4</td>
</tr>
<tr>
<td>8</td>
<td>7,83</td>
<td>7,22</td>
</tr>
<tr>
<td>16</td>
<td>4,59</td>
<td>12,32</td>
</tr>
<tr>
<td>32</td>
<td>2,64</td>
<td>21,41</td>
</tr>
<tr>
<td>48</td>
<td>1,72</td>
<td>32,87</td>
</tr>
<tr>
<td>64</td>
<td>1,6</td>
<td>35,33</td>
</tr>
<tr>
<td>96</td>
<td>1,7</td>
<td>33,25</td>
</tr>
</tbody>
</table>
<p>Мы можем видеть, что ни о каком сверхлинейном ускорении и речи быть не может.</p>
<p>Тем не менее, в качестве выводов хотелось бы сделать следующее замечание. В данном примере параллельный метод решения задачи показал большую эффективность, нежели последовательный. И теперь идеи параллельного решения можно попробовать использовать для улучшения последовательного. Мы же привыкли слышать другие утверждения, параллельные методы показывают худшую эффективность, а хорошие последовательные плохо распараллеливаются.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/04/2002434/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grand Central Dispatch от Apple</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/11/03/grand-central-dispatch-apple/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/03/grand-central-dispatch-apple/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 08:11:26 +0000</pubDate>
		<dc:creator>ialexander</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/03/grand-central-dispatch-apple/</guid>
		<description><![CDATA[Лично для меня из новинок в Mac OS X 10.6 Snow Leopard наиболее интересна задаче-ориентированная (во, загнул) технология параллельного программирования Grand Central Dispatch (GDC). GCD предлагает разделять весь выполняемый код на независимые задачи (tasks) и помещать их в очереди, откуда они запускаются при наличии свободных ресурсов. Если в числе свободных у нас числятся 4 ядра, то [...]]]></description>
			<content:encoded><![CDATA[<p>Лично для меня из новинок в Mac OS X 10.6 Snow Leopard наиболее интересна задаче-ориентированная (во, загнул) технология параллельного программирования Grand Central Dispatch (GDC).<br />
GCD предлагает разделять весь выполняемый код на независимые задачи (tasks) и помещать их в очереди, откуда они запускаются при наличии свободных ресурсов. Если в числе свободных у нас числятся 4 ядра, то одновременно у нас будет выполняться 4 потока.</p>
<p>Перед тем, как привести пример работы технологии, придется рассказать о недавно добавленной поддержке замыканий в C/C++/Objective-C под называнием "блоки". Блоки объявляются с помощью нового оператора ^:</p>
<pre name="code" class="cpp">int i = 5;
testb = ^(char *s) { printf("string is %s, number is %d\n", s, i); };
testb("hello");</pre>
<p>Результатом вызова в 3-й строке будет:</p>
<blockquote><p>string is hello, number is 5</p></blockquote>
<p>Подробнее о блоках мы можете почитать в википедии: <a href="http://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D0%BA%D0%B8_%28%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%D0%B8%29">Блоки (расширение языка Си)</a>.<a href="http://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D0%BA%D0%B8_%28%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%D0%B8%29"><br />
</a></p>
<p>Итак, на входе у нас имеется следующий последовательный код:</p>
<pre name="code" class="cpp">for (i = 0; i &lt; count; i++) {
      results[i] = do_work(data, i);
}
total = summarize(results, count);</pre>
<p>При условии, что функция do_work не изменяет какие-либо глобальные переменные, мы можем распараллелить с помощью OpenMP:</p>
<pre name="code" class="cpp">#pragma omp parallel for
for (i = 0; i &lt; count; i++) {
      results[i] = do_work(data, i);
}
total = summarize(results, count);</pre>
<p>А при использовании GDC код будет выглядеть так:</p>
<pre name="code" class="cpp">dispatch_apply(count, dispatch_get_global_queue(0, 0), ^(size_t i){
     results[i] = do_work(data, i);
    });
total = summarize(results, count);</pre>
<p>Почувствуйте, что называется разницу. На самом деле разница, конечно, есть. Технология Apple имеет более широкое применение, к примеру, задачи мы можем запускать не только параллельно, но и асинхронно (dispatch_async), а также запускать в определенное время (dyspatch_after). Таким образом, GDC поддерживает не только параллельные вычисления, но обеспечивает новый способ добавления асинхронности в приложения. Притом этот способ действительно выглядит весьма прозрачным и простым, как утверждает Apple. Мало того, Apple обещает, что создание и запуск задачи будет требовать очень мало ресурсов, намного меньшие чем создание и запуск потока.</p>
<p>В целом, Grand Central Dispatch выглядит неплохо, предлагает новый подход к созданию параллельных приложений и асинхронных вызовов (хотя концепция задачи отнюдь не нова, она давно витает в воздухе), но на революцию совсем не тянет. Т. к. основная задача распараллеливания - выделение независимых участков кода, которые могут выполняться параллельно, все равно остается на разработчике.</p>
<p>Что интересно, Apple выпустила GCD под открытой лицензией Apache, и в данный момент эта технология уже портирована на FreeBSD (см. [1]).</p>
<p>Ссылки:</p>
<ol>
<li><a href="http://libdispatch.macosforge.org/">libdispatch</a></li>
<li><a href="http://ru.wikipedia.org/wiki/Grand_Central_Dispatch">Wikipedia: Grand Central Dispatch</a></li>
<li><a href="http://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D0%BA%D0%B8_%28%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%D0%B8%29">Wikipedia: Блоки (расширение языка Си)</a></li>
<li><a href="http://habrahabr.ru/blogs/macosxdev/66632/">Поддержка замыканий в Snow Leopard</a></li>
</ol>
<p>P.S. По этой теме я перевел 2 статьи англоязычной википедии про GCD и Blocks, и понятное дело, разместил их перевод в русской википедии. В ходе перевода пришлось сделать ряд допущений, к примеру, Blocks перевел как блоки, а Task Parallelism - параллелизм задач (есть вариант параллелизм заданий). В общем, я усиленно намекаю что, критика перевода и особенно его улучшение приветствуются.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/03/grand-central-dispatch-apple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вступление, или о параллельных вычислениях</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/11/02/2002402/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/02/2002402/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 08:08:46 +0000</pubDate>
		<dc:creator>ialexander</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/02/2002402/</guid>
		<description><![CDATA[То, что за параллельными вычислениями будущее - оно, конечно так. Это еще наши дедушки смогли понять, когда осознали, что процессор в 1 гигагерц им и за миллиард полновесных рублей не продадут, а вот 1000 процессоров по 1 мегагерцу - за милое дело.]]></description>
			<content:encoded><![CDATA[<p>Всего вам доброго. Это логически первая запись на моем интеловском блоге. Мое имя Александр Игнатьев и последние 2 года я занимаюсь паралельными вычислениями, как по месту своей основной работы, так и по месту своей основной учебы - Вычислительный центр РАН. (Подумалось: Мое имя Майк и последние 2 года я алкоголик).</p>
<p>Тематика блога вряд ли будет отличаться от моих интересов: технологии параллельных вычислений MPI, OpenMP, CUDA, PThreads и пр.</p>
<p>То, что за параллельными вычислениями будущее - оно, конечно так. Это еще наши дедушки смогли понять, когда осознали, что процессор в 1 гигагерц им и за миллиард полновесных рублей не продадут, а вот 1000 процессоров по 1 мегагерцу - за милое дело.</p>
<p>А уж в современном мире, где тактовая частота процессоров плавает где-то около своего  технологического предела, и основным направлением в развитии процессоров стало повышение количества ядер, выбора особого и не остается. И вот гром грянул раз, когда вышли 2-ядерные процессоры, грянул два, когда появились 4-ядерные, а теперь он грозится долбануть в третий раз. Но мировой разработчик не особо и чешется. Почему?</p>
<p>Ну хотя бы с того, что это просто сложно. Сложно сломать свое последовательное мышление и думать параллельно, сложно выискивать участки кода, которые можно распараллелить. Да что уж тут говорить о параллельности, когда большая часть разработчиков говорит, что указатели памяти - сложная концепция. Но именно эта особенность - меня и привлекает. Параллельные вычисления - та отрасль в IT, где еще можно подключить мозги. Это ведь намного лучше, чем бросать контролы на формочку и задавать атрибутами длину поля и прочую лабуду.</p>
<p>Вот и получается так - отрасль перспективная, востребованная и нужная, но специалистов в ней не так и много. Все это мне напоминает романтику первых десятилетий истории IT.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/02/2002402/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

