<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Intel Software Network Blog - Russia</title>
	
	<link>http://software.intel.com/ru-ru/blogs</link>
	<description />
	<pubDate>Sun, 08 Nov 2009 22:05:46 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ISNBlogRussia" type="application/rss+xml" /><feedburner:emailServiceId>ISNBlogRussia</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Миллион шагов на месте</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/Jq5AXi9RadA/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/08/2002466/#comments</comments>
		<pubDate>Sun, 08 Nov 2009 01:24:53 +0000</pubDate>
		<dc:creator>Alexey Kukanov (Intel)</dc:creator>
		
		<category><![CDATA[Параллельное программирование]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/08/2002466/</guid>
		<description><![CDATA[Задавшись в комментариях к записи "33 шага назад" вопросом, каким образом введение параллелизма может поменять асимптотические характеристики алгоритма, я должен был быстрее догадаться, каков правильный ответ. ]]></description>
			<content:encoded><![CDATA[<p>Для тех, кто не в курсе, о чём пойдёт речь, попробую сделать краткое вступление.</p>
<p>В своей записи на здешней блог-площадке Вячеслав Любченко привёл графики времени работы параллельного рекурсивного алгоритма нахождения чисел Фибоначчи в зависимости от порядкового номера числа в последовательности. И в случае реализации алгоритма на TBB время росло экспоненциально, а у реализации, где структура алгоритма описана при помощи конечных автоматов (КА) - линейно!</p>
<p>В чём тут дело, я должен был догадаться раньше, почти сразу. Никакой параллелизм не способен перевести экспоненциальную сложность исходного алгоритма в линейную, кроме ... экспоненциально растущего :) </p>
<p>Исполнение рекурсивного алгоритма определения числа Фибоначчи суть есть обход двоичного дерева с подсчётом его листьев. Последовательное исполнение - обход в глубину, параллельное - обход в ширину. Глубина дерева - N-1, где N - порядковый номер искомого числа Фибоначчи (рассматриваем N&gt;1, считая, что для N&lt;=1 решение известно). Для идеально сбалансированного двоичного дерева на каждом ярусе глубины d содержится 2 в степени d (2^d) узлов; соответственно, количество листьев - 2^(N-1). В нашей задаче дерево не сбалансировано; но можно показать, что и в нашем случае максимальное количество узлов на одном ярусе, как и общее количество узлов, имеет асимптотическую оценку O(2^N). </p>
<p>В КА реализации у Вячеслава каждому узлу дерева соответствует один конечный автомат, а в самой простой реализации на TBB - одна "задача", то есть объект класса, унаследованного от tbb::task. Все автоматы, как и все задачи, могут работать/исполняться независимо друг от друга. Так откуда же разница в поведении?</p>
<p>А разница, на самом деле, в применённых методиках измерения. При оценке поведения КА реализации Вячеслав использовал дискретное время. За один такт дискретного времени все автоматы осуществляют переход из одного состояния в другое, причём их количество на дискретное время не влияет. По сути, время оценивается <em>до</em> этапа отображения (mapping) возможного параллелизма на конкретную аппаратную платформу.</p>
<p>При получении же графиков для TBB и MC# использовалось время "настенное" (wall clock time), измеренное <em>после</em> отображения возможного параллелизма на реальную платформу, в которой фактическая степень параллелизма равна 2 и постоянна. Чуда не случится, от добавления второго (4-го, 32-го) ядра асимптотическое поведение алгоритма не изменится.</p>
<p>Чтобы поведение алгоритма, предсказанное в дискретном времени, совпадало с поведением во времени реальном, необходима такая же степень реального (аппаратного) параллелизма, какова была степень параллелизма при получении оценки. То есть, для достижения асимптотического поведения О(N) необходим аппаратный параллелизм порядка O(2^N). Подумаешь, всего какой-то миллион или около того ядер для вычисления 30-го числа Фибоначчи <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Причём, если зафиксировать аппаратный параллелизм даже на этом уровне и продолжить увеличивать N, то асимптотическое поведение быстро вернётся к экспоненциальному; для сохранения линейности алгоритма необходимо и дальше экспоненциально наращивать мощность. Представьте себе компьютер, в котором сколь угодно много вычислителей добавляются динамически по мере надобности и сразу же встраиваются в работу программы. Это, конечно, классно, но боюсь, ещё долго останется нереальным.</p>
<p>Чтобы избежать сравнения яблок с томатами, можно для КА реализации алгоритма построить график зависимости <em>реального</em> времени от N. Поскольку переходы для всех автоматов обсчитываются последовательно на одном ядре, реальное время, соответствующее одному дискретному такту, будет сильно разным для моделей из десятка и из миллиона автоматов, а в результате на графике будет та же экспонента (что Вячеслав и подтвердил в комментариях).</p>
<p>Справедливости ради замечу, что Вячеслав предпринял попытку привести измеренное реальное время в форму, пригодную для сравнения с дискретным. Но это, на мой взгляд, невозможно. Его идея об использовании времени работы итеративного алгоритма в качестве нормирующего фактора явно не работает. Докажу от противного: если такое преобразование приводит реальное время в форму, сопоставимую с дискретным, то это должно быть истинно и для КА модели. Реальное время T работы КА программы растёт как O(2^N), при нормировании константой получим время T'=T*O(1), то есть растущее по тому же закону. Соответствия поведению дискретного времени DT ~ О(N) мы не получили, значит, преобразование не достигает желаемой цели.</p>
<p>Стало быть, выводы, которые Вячеслав сделал о TBB как параллельной модели, некорректны, так как исходили из ложных посылок.</p>
<p>В завершение замечу, что TBB и другие модели, которые умеют отображать потенциальный параллелизм на реально присутствующий аппаратный, для задач с рекурсивным параллелизмом будут выдавать решение, масштабируемое с ростом количества доступных ядер - в отличие от последовательной реализации КА модели у Вячеслава, которая, сколько ядер не добавь, будет пока что топтаться на месте. Всеми миллионами конечных автоматов, в ритме дискретного времени :)</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/Jq5AXi9RadA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/08/2002466/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/08/2002466/</feedburner:origLink></item>
		<item>
		<title>Прощай, игровая индустрия?</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/iKKQo4B4-FE/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/06/2002456/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 11:40:32 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
		
		<category><![CDATA[Игры]]></category>

		<category><![CDATA[Конкурсы и мероприятия]]></category>

		<category><![CDATA[Goblin]]></category>

		<category><![CDATA[Гоблин]]></category>

		<category><![CDATA[игровая индустрия]]></category>

		<category><![CDATA[Игромир]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/06/2002456/</guid>
		<description><![CDATA[Есть мнение, что к следующей осени мы рискуем не досчитаться не только "Игромира", но и пары-тройки отечественных производителей игр, которых и так немного. Хорошо это или плохо? Трудно сказать. С одной стороны, хороших российских игр и в лучшие годы было мало, а покупать шлак из чувства патриотизма почему-то не хотелось. С другой, какую-никакую, но рыночную нишу ПОТОМ вернуть назад будет почти невозможно. Да и тренироваться на кошечках начинающим российским программистам станет негде]]></description>
			<content:encoded><![CDATA[<p>Ездил сегодня на выставку "Игромир", что проходит на ВВЦ в павильоне 57. Увиденным там остался неприятно удивлен. Уж на что скромненько было в прошлом году, а в этом и вовсе ужас-ужас. Половина первого этажа практически пустует, на втором же площадь поделили на троих Electronic Arts, Microsoft да Sony. Осваивали квадратные метры явно по принципу "лишь бы занять", и поэтому добрая половина экспозиции EA и Sony занята... пуфиками. Только у Sony они обычные, а у EA в форме мячиков. Очень весело, если бы не было так грустно.</p>
<p>Наши же игроделы представлены архискромно. Стендов, как таковых, нет ни у кого - даже у великой 1С. Так, тематические инсталляции с мониторчиками. Кризис, скажете? Он самый, только вы даже не представляете - насколько серьезно он затронул наших игроделов. Один знающий человек сказал мне, что у самой крупной на нашем рынке компании (простите, не могу сказать точнее) продажи упали... нет, не в два раза. Не в четыре. Не в десять. В ПЯТЬДЕСЯТ раз. Мне самому не верится в такие цифры, однако не доверять источнику нет ни единой причины. Если для западного издателя такое падение еще как-то переносимо за счет внутреннего жирка, то для наших... Мда.</p>
<p>Есть мнение, что к следующей осени мы рискуем не досчитаться не только "Игромира", но и пары-тройки отечественных производителей игр, которых и так немного. Хорошо это или плохо? Трудно сказать. С одной стороны, хороших российских игр и в лучшие годы было мало, а покупать шлак из чувства патриотизма почему-то не хотелось. С другой, какую-никакую, но рыночную нишу ПОТОМ вернуть назад будет почти невозможно. Да и тренироваться на кошечках начинающим российским программистам станет негде...</p>
<p>А пока музыка еще играет, сходите на "Игромир"! Завтра и послезавтра там обещают быть всякие конкурсы с призами, а еще на стендах можно будет встретить Джо Кукана, сыгравшего негодяя Кейна в сериале Command&amp;Conquer, а также Дмитрия Юрьевича Пучкова АКА Goblin. Ценная наводка: Кейн будет завтра не раньше второй половины дня, тогда как Д.Ю. планирует отработать с утра до вечера.</p>
<p>Я может быть тоже в субботу еще разок съезжу. Многие недели и месяцы, проведенные в мире C&amp;C, стучат в моем сердце.</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/iKKQo4B4-FE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/06/2002456/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/06/2002456/</feedburner:origLink></item>
		<item>
		<title>Тридцать три шага назад!?</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/JU46WXiArro/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/06/2002442/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 11:29:04 +0000</pubDate>
		<dc:creator>vlubch</dc:creator>
		
		<category><![CDATA[Параллельное программирование]]></category>

		<category><![CDATA[TBB]]></category>

		<category><![CDATA[Фибоначчи]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/06/2002442/</guid>
		<description><![CDATA[Если доверять классикам, то иногда нужно сделать шаг назад, чтобы потом - два шага вперед. А что же в параллельном программировании? Куда мы шагаем, что и в чем выигрываем? Чтобы легче было шагать, нам в помощь дадены разнообразные средства для параллельного программирования – языки, библиотеки и т.п. Обратим свой взгляд на библиотеку Intel® TBB (Intel® Threading Building Blocks) и посмотрим, куда она нас приведет.]]></description>
			<content:encoded><![CDATA[<p>На мою просьбу написать рекурсивный параллельный алгоритм на базе TBB так никто и не откликнулся. Алексей Куканов – молчит, прошу прощения, как рыба, несмотря на мои неоднократные обращения к нему лично, у остальных – свои проблемы и, видимо, интересы. Но, как мне представляется, интересы у нас одни – параллельное программирование, а потому нужен все же диалог. Хотя бы… ну хоть кто-нибудь намекнул, что данный алгоритм приведен в документации к Intel® TBB (Intel® Threading Building Blocks)! Или, может, Алексей не следит за блогами, а остальные не знакомы с ее описанием? И то и другое достаточно удивительно, если не сказать странно! <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> Тем не менее, к вящей радости проблема нашла свое решение – сам нашел! <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Но – к делу! Если доверять классикам, то иногда нужно сделать шаг назад, чтобы потом - два шага вперед. А что же в параллельном программировании? Куда мы шагаем, что и в чем выигрываем? Чтобы легче было шагать, нам в помощь дадены разнообразные средства для параллельного программирования – языки, библиотеки и т.п. Обратим свой взгляд на библиотеку Intel® TBB (Intel® Threading Building Blocks) и посмотрим, куда она нас приведет. Будет ли наш «параллельный путь» легче и/или быстрее.</p>
<p>Собираясь в дальний путь, настоятельно рекомендуется проверить средства передвижения. В противном случае – это халатность, граничащая с безрассудством. Целям проверки в дистрибутиве TBB служат ее тестовые примеры. Выберем из множества примеров, имеющихся в составе дистрибутива, один из самых простых и наглядных – вычисление чисел Фибоначчи. Это проект fibonacci из дистрибутива TBB.</p>
<p>Числа Фибоначчи нам известны, или должны быть известны, с юных лет (см., например, «Энциклопедический словарь юного математика»). Результаты тестовых прогонов для чисел в диапазоне от 20-го до 28-го числа по обычным алгоритмам – императивному и рекурсивному и параллельному аналогу рекурсивного алгоритма сведены в таблицу 1.</p>
<blockquote><p><code>Таблица 1.<br />
20       21       22       23       24       25      26       27       28<br />0,002033 0,002187 0,002333 0,002502 0,002678 0,00282 0,002978 0,003184 0,003376<br />0,5717   0,9314   1,499674 2,427057 3,948402 6,3763  10,30745 16,63595 26,99721<br />38,277   61,795   100,736  162,243  264,04   427,75  691,78   1119,94  1808,8<br />19,626   32,397   50,981   82,236   132,24   214,11  344,99   557,68   903,44</code></p></blockquote>
<p>В ней первая строка соответствует номеру числа, вторая - реальному времени работы императивного алгоритма, третья - рекурсивного, четвертая и пятая – однопоточной и двухпоточной версиям рекурсивного алгоритма на базе TBB. Рекурсивный алгоритм заимствован из документа Tutoril комплекта документации к TBB, используемый процессор - Intel® Core™2 CPU 6400 @ 2,13 GHz.</p>
<p>Поскольку тестирование проводилось на двухядерном процессоре, то время работы «двухядерного» варианта меньше ровно в два раза. Эффект от многоядерности налицо! Однако, если мы сравним время работы алгоритмов во второй строке и в четвертой, то имеем замедление работы более чем в тридцать три раза (на первую строку лучше не смотреть!). Или, другими словами, чтобы достичь скорости исходного алгоритма, запрограммированного обычным способом и на одном ядре, нам нужно будет минимум шестьдесят шесть (!) ядер, чтобы хотя бы приблизиться к нему по производительности. Глядя на таблицу и вспоминая вопрос Сергея Вильянова – «Есть ли реальная польза от многоядерных процессоров?», напрашивается один ответ – нет, т.к. медленно!</p>
<p>При такой скорости многоядерности сложно быть «торопливым» (см. <a href="http://software.intel.com/ru-ru/blogs/2009/02/12/2000639/">http://software.intel.com/ru-ru/blogs/2009/02/12/2000639/</a>). Мечталось-то, ведь, совсем о другом! Но если серьезно, то подобные факты не способствуют оптимизму, т.к. желаемое и в этот раз только отодвинулось, причем на достаточно большое расстояние, т.к. о более чем шестидесятиядерном процессоре сейчас, думаю, даже мечтать нельзя, хотя и ходят разговоры о тысячах ядер!</p>
<p>Но проблема-то, как это ни удивительно, не в скорости. Скорость - это как раз поправимо. Проблема глубже. Если мы немного «пошаманим» с таблицей, то вдруг выясняется, что параллелизма как такового библиотека TBB в приложение не добавляет. Скрытое становится явным, если мы посмотрим на графики алгоритмов, которые приведены к времени вычисления императивного алгоритма (к вычислению 20-го числа).</p>
<p>На рис. 1 графики обычного рекурсивного алгоритма и его параллельных аналогов совпадают идеально, имея экспоненциальный характер роста зависимости скорости работы от номера числа в ряду Фибоначчи. А вот скорость императивного алгоритма, как легко видеть, представляет собой линейную функцию (см. ряд 1 на рис.1).</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/d180d0b8d181-11.jpg"><img class="size-medium wp-image-2002441 alignnone" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/d180d0b8d181-11-300x169.jpg" alt="" width="300" height="169" /><br />
</a><em>Рис.1. График зависимости скорости работы программы от n</em></p>
<p>Но, может, так оно и должно быть? Т.е. если мы имеем обычный рекурсивный алгоритм и его эквивалентный параллельный аналог, то и характер их поведения должен быть похожим в силу свойств алгоритма? Но зачем тогда параллелизм? Тем более, как можно видеть, мы только усугубляем ситуацию, усложняя программирование (см. на код с TBB) да еще и многократно замедляя работу программ.</p>
<p>Но, слава Богу (или – нам?), можно показать, что ситуация не столь уж удручающая. Параллельным программированием заниматься можно и нужно. Так, для нашего случая зависимость скорости расчета от номера числа у параллельного рекурсивного алгоритма должна быть столь же линейна, как и у последовательного императивного алгоритма. Уже только это - источник большого оптимизма. Важно переломить тенденцию, т.к. скорость увеличить достаточно просто (правда, до известных пределов, которых мы, к сожалению, уже фактически достигли). Ну а о том, что это возможно, в следующем блоге.</p>
<p>Весьма важное замечание. Сейчас мы в поиске надежных, эффективных и адекватных средств и/или моделей параллельных вычислений. В этом смысле параллельный рекурсивный алгоритм оказался «лакмусовой бумажкой» тестирования библиотеки на адекватность параллелизму. Пока, как показало испытание, несмотря на заявленный параллелизм, ТВВ не влияет качественно на свойства алгоритма (скажем осторожно – в данном случае). Да, отдавая ей должное, TBB использует множество ядер (см. таблицу 1), но при этом не добавляет параллельных свойств алгоритму. Что делать? Это уже вопрос, наверное, к … Алексею. Если, конечно, он не отмолчится в очередной раз <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>И еще. Сороковое число обычный рекурсивный алгоритм считает почти за 9 сек, параллельный двухпоточный – за 290 сек! Все то же сакральное - «тридцать три». Параллелизм – полный! <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>А интересно, какую зависимость получим, протестировав параллельный рекурсивный алгоритм на MC#? Этого я, честно, пока не знаю. Вот выяснением этого и займусь. Проблема только в одном – мне известно, что уже на 16-м/17-м числе программа на MC# аварийно завершает свою работу. Значит, нужно выбирать другой диапазон…</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/JU46WXiArro" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/06/2002442/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/06/2002442/</feedburner:origLink></item>
		<item>
		<title>64-битный мир становится ближе</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/HlKxjdzgG6o/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/05/2002421/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 07:10:44 +0000</pubDate>
		<dc:creator>Andrey Karpov</dc:creator>
		
		<category><![CDATA[Разработка софта]]></category>

		<category><![CDATA[64-bit]]></category>

		<category><![CDATA[64-bit Windows]]></category>

		<category><![CDATA[64-битный]]></category>

		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/05/2002421/</guid>
		<description><![CDATA[Выпущенная в июле 2009 года Windows Server 2008 R2 доступна только в 64-битном варианте.]]></description>
			<content:encoded><![CDATA[<p>Занимаясь созданием инструментов для разработчиков <a href="http://www.viva64.com/terminology/64-bit_rus.html">64-битных приложений</a>, мы постоянно следим за ситуацией в мире. Какие выходят новые процессоры, какие новые операционные системы и технологии. Это нужно для того, чтобы понимать тенденции развития отрасли и в соответствии с этими тенденциями строить свои планы. Хочу привести небольшую заметку Евгения Рыжкова по поводу 64-битных версий операционной системы Windows.</p>
<p>Несколько лет назад в 2007 году руководитель подразделения Microsoft Windows Server Бил Лейнг <a href="http://windowsvistablog.com/blogs/windowsvista/archive/2007/05/18/on-64-bit-and-windows-client.aspx">заявил</a>: "Windows Server 2008 будет последней 32-битной операционной системой. Все будущие версии операционных систем для серверов от Microsoft после Windows Server 2008 будут 64-битными". Тогда мы вывесили эту цитату на страницу продукта Viva64 и, надеемся, она стимулировала разработчиков программ делать 64-битные версии своих приложений.</p>
<p>Операционная система Windows Server 2008, выпущенная в феврале 2008 года, была представлена в 32-битном и в 64-битном вариантах.</p>
<p><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/m01.png" border="0" alt="" /></p>
<p><em>Рисунок 1 - Логотип Windows Server 2008 </em></p>
<p>Однако выпущенная в июле 2009 года следующая версия Windows Server 2008 R2 доступна только в 64-битном варианте!</p>
<p><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/m02.png" border="0" alt="" /></p>
<p><em>Рисунок 2 - Логотип Windows Server 2008</em></p>
<p>Похоже, что действительно больше 32-битных серверных операционных систем от Microsoft мы не увидим. И это понятно, ведь без 32-битной версии системы затраты на поддержку для Microsoft (со временем) сократятся.</p>
<p>Однако на остановке выпусков 32-битной версии системы Microsoft не остановилась.</p>
<p>Многие администраторы знают про относительно новый режим установки и работы серверной версии операционной системы под названием Server Core.</p>
<p><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/m03.png" border="0" alt="" /></p>
<p><em>Рисунок 3 - Установка в режиме Server Core </em></p>
<p>Это тот режим, о котором участники войн "Windows vs Linux" говорили очень давно. Одним из аргументов сторонников использования Linux на сервере была возможность установить серверную ОС без графического интерфейса (GUI). Но вот и в Windows Server появилась такая возможность. Установка в этом режиме позволяет получить только командную строку без пользовательского интерфейса.</p>
<p>Эта возможность (установка Server Core) появилась в Windows Server 2008. Но в Windows Server 2008 R2 появилось нововведение, приближающее 64-битное будущее. При установке Windows Server 2008 R2 (Server Core) поддержка запуска 32-битных приложений <a href="http://blogs.msdn.com/volkerw/archive/2009/02/09/32-bit-optional-in-windows-server-2008-r2.aspx">стала опциональной</a>! Причем по умолчанию эта поддержка выключена. И при попытке запуска 32-битного приложения в режиме Server Core, пользователь получит сообщение о невозможности запуска. Конечно, можно добавить поддержку 32-битных программ:</p>
<p><quote>start /w ocsetup ServerCore-WOW64</quote></p>
<p>В обычном (Full Installation) режиме 32-битные приложения по умолчанию запускаются, а вот в Server Core - уже нет.</p>
<p>Причины этого понятны. Помимо уже упоминавшейся сложности поддержки нескольких платформ, 64-битные программы, как правило, более безопасны.</p>
<p>Тенденция очевидна. Все меньше и меньше возможностей у программистов откладывать выпуск 64-битных версий своих приложений.</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/HlKxjdzgG6o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/05/2002421/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/05/2002421/</feedburner:origLink></item>
		<item>
		<title>Сверхлинейное ускорение</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/p-cDWCU_Igg/</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>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/p-cDWCU_Igg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/04/2002434/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/04/2002434/</feedburner:origLink></item>
		<item>
		<title>Проблемы 64-битного кода в реальных программах: виртуальные функции</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/JcHbEf3Gw_k/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/04/2002416/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 08:11:14 +0000</pubDate>
		<dc:creator>Andrey Karpov</dc:creator>
		
		<category><![CDATA[Разработка софта]]></category>

		<category><![CDATA[64-bit]]></category>

		<category><![CDATA[64-bit migration]]></category>

		<category><![CDATA[64-битный]]></category>

		<category><![CDATA[PVS-Studio]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/04/2002416/</guid>
		<description><![CDATA[Об одной проблеме при миграции кода на 64-битные системы, связанной с некорректной перегрузкой виртуальных функций мы писали в наших статьях уже давно. Например, наша статья "20 ловушек переноса Си++ - кода на 64-битную платформу" вышла в марте 2007 года (хотя ничуть не утратила актуальности). В ней было описание проблемы с виртуальными функциями. Суть проблемы заключается в следующем.]]></description>
			<content:encoded><![CDATA[<p>Об одной проблеме при миграции кода на 64-битные системы, связанной с некорректной перегрузкой виртуальных функций мы писали в наших статьях уже давно. Например, наша статья "<a href="http://www.viva64.com/art-1-1-1958348565.html">20 ловушек переноса Си++ - кода на 64-битную платформу</a>" вышла в марте 2007 года (хотя ничуть не утратила актуальности). В ней было описание проблемы с виртуальными функциями. Суть проблемы заключается в следующем. С незапамятных времен в библиотеке MFC есть класс CWinApp, в котором имеется функция WinHelp:</p>
<pre name="code" class="cpp">class CWinApp {
  ...
  virtual void WinHelp(DWORD dwData, UINT nCmd);
};</pre>
<p>Для показа собственной справки в пользовательском приложении необходимо было эту функцию перекрыть:</p>
<pre name="code" class="cpp">class CSampleApp : public CWinApp {
  ...
  virtual void WinHelp(DWORD dwData, UINT nCmd);
};</pre>
<p>И все было прекрасно до тех пор, пока не появились 64-битные системы. Тогда разработчикам MFC пришлось поменять интерфейс функции WinHelp (и некоторых других) так:</p>
<pre name="code" class="cpp">class CWinApp {
  ...
  virtual void WinHelp(DWORD_PTR dwData, UINT nCmd);
};</pre>
<p>В 32-битном режиме типы DWORD_PTR и DWORD совпадали, а вот в 64-битном... Естественно разработчики пользовательского приложения тоже должны были сменить тип на DWORD_PTR для корректной перегрузки, но компилятор про это не говорил, и ошибка выявлялась только на этапе тестирования, когда справочная система вела себя "загадочно". За подробностями я отсылаю читателя к упомянутой выше статье.</p>
<p>Вспомнить эту ошибку меня заставил тот факт, что сегодня, в конце 2009 года эта ошибка до сих пор есть в коде реальных приложений. Сомневаетесь?</p>
<p>Есть прекрасная библиотека компонентов <a href="http://www.bcgsoft.com/bcgcontrolbarpro.htm">BCGControlBar</a>. Наверняка вы про нее слышали, поскольку компоненты компании BCGSoft Ltd включены в Microsoft Visual Studio 2008 Feature Pack. Так вот, если скачать ознакомительную версию этой библиотеки, установить ее и выполнить поиск слова "WinHelp" по .h-файлам... то мы увидим, что везде, где якобы перекрыта эта функция, используется параметр DWORD, вместо DWORD_PTR. А это означает, что справка в 64-битной системе в этих классах будет вести себя некорректно.</p>
<p>Неужели подобная ошибка может до сих пор быть в коде такой известной библиотеки? Я думаю дело в том, что клиентам компании доступны исходные коды этой библиотеки и клиенты всегда могут поправить эти коды. Кроме того, в настоящее время функция WinHelp используется очень редко. Намного чаще используется HtmlHelp. А она-то в BCGControlBar имеет правильный параметр DWORD_PTR. Однако факт остается фактом. Ошибка есть во вполне реальном коде и компилятор ее не обнаружит.</p>
<p>Что делать? Использовать специализированные анализаторы кода. Например, PVS-Studio. Ведь этот анализатор с момента своего создания умеет находить такие ошибки, а справочная система содержит подробный пример (смотрите описание ошибки <a href="http://www.viva64.com/content/PVS-Studio-help-ru/V301.html">V301</a>).</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/JcHbEf3Gw_k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/04/2002416/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/04/2002416/</feedburner:origLink></item>
		<item>
		<title>Все(ё) в виртуальность!</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/q9ihoViefo4/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/03/2002431/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 15:59:06 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[виртуальность]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/03/2002431/</guid>
		<description><![CDATA[Пожалуй, единственное, что должно остаться в компьютере – это мощный многоядерный процессор и операционная система, максимально оптимизированная под многоядерность и способная «помогать» глупеньким приложениям, чьи создатели поленились или не захотели сами заниматься оптимизацией.]]></description>
			<content:encoded><![CDATA[<p>В ожидании выходного дня, хотелось бы поиграть в оракула. В моем новом домовладении стоит целых два цифровых термометра. Породу их не помню, да это, пожалуй, и неважно. Термометры простенькие, но температуру за окном показывают исправно, причем один из них даже снабжен радиомодулем, что позволяет вывешивать датчик за окном, а цифры считывать с панельки, стоящей на комоде. Однако, когда мне нужно узнать подробности о погоде, я бегу не к комоду, а к телефону, где установлено приложение Accuweather. Эта мелочь потрясающе удобна, потому что показывает не только температуру в данный момент, но и планы природы на ближайшие 15 часов. Причем, о чудо, программка практически не ошибается, и если сказала, что в 14-00 пойдет дождик, без зонта лучше на улицу не выходить, каким бы голубым не было небо. Дождь будет. И если не в 14-00, то максимум в 14-30.</p>
<p>И вот подумалось – а что еще из сугубо физического мира может переехать в виртуальность? Ну, про знакомства все понятно – поднимите-ка руки, кто встретил своего нынешнего партнера вживую, на каком-нибудь празднестве или на работе? Гм, ну может быть у вас, в России такие архаизмы еще встречаются, а в Москве и Питере считается естественным находить себе пару по аське или через сайт знакомств. И ничего, получается ничуть не хуже, чем в стародавние оффлайновые времена.</p>
<p>А что еще в виртуальность перетаскивается?</p>
<p>Например, мощная видеокарта – кому она нужна в компьютере? Пусть производитель хранит все текстуры игры у себя на сервере, и там же обсчитывает картинку, а на компьютер пользователю отправляет только готовый результат. Поправьте меня, но для такого варианта не нужно запредельно скоростное интернет-соединение. 60-70 мегабит должно хватить даже для хорошего шутера на приличном мониторе, а уж про всякие аркадки и стратегии и говорить не приходится. В Японии это норма уже сегодня, а значит лет через пять и мы догоним.</p>
<p>Игровому звуку тоже совершенно не надо изготовляться на компьютере пользователя. Даже шестиканальный занимает настолько мало места, что лучше сделать и раскидать его по дорожкам на удаленном всемогущем сервере.</p>
<p>Данные? Ну, конечно, даже 100-мегабитный удаленный винчестер вряд ли кого-то порадует, однако значительная часть файлов поддается неслабому сжатию, что в сочетании с небольшими размерами этих самых файлов может сделать виртуальный накопитель весьма интересным решением. Например, файлы до 10 мегабайт включительно система по умолчанию будет сохранять где-то в онлайне, а те, что побольше – на компьютере. За скорость доступа к файлам тоже переживать не стоит – вспомним о технологии ReadyBoost и ценах на флэшки. В 8-гигабайтном USB-стике (800-900 рублей) уместятся все часто используемые приложения и файлы для мгновенного доступа, тогда как остальное может спокойно подкачиваться из Сети.</p>
<p>Пожалуй, единственное, что должно остаться в компьютере – это мощный многоядерный процессор и операционная система, максимально оптимизированная под многоядерность и способная «помогать» глупеньким приложениям, чьи создатели поленились или не захотели сами заниматься оптимизацией. Насчет процессора – это не потому, что я так люблю Intel. Просто он пропускает через себя такие объемные потоки данных, что виртуализировать и его – себе дороже выйдет.</p>
<p>На сим моя фантазия заканчивается, однако было бы архиинтересно услышать ваши идеи насчет переноса функционала физических объектов в онлайн. Сам, после недели попыток купить в Москве нормальный 100-литровый аквариум, всерьез подумываю ограничиться виртуальными рыбками, которые в новых версиях почти ничем не отличаются от настоящих…</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/q9ihoViefo4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/03/2002431/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/03/2002431/</feedburner:origLink></item>
		<item>
		<title>Grand Central Dispatch от Apple</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/CAPwtb9Fqo0/</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>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/CAPwtb9Fqo0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/03/grand-central-dispatch-apple/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/03/grand-central-dispatch-apple/</feedburner:origLink></item>
		<item>
		<title>Обработка исключений внутри параллельных секций</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/bTcS9ugR3Eo/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/03/2002248/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 06:09:40 +0000</pubDate>
		<dc:creator>Andrey Karpov</dc:creator>
		
		<category><![CDATA[Параллельное программирование]]></category>

		<category><![CDATA[Разработка софта]]></category>

		<category><![CDATA[openmp]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/03/2002248/</guid>
		<description><![CDATA[Использование nothrow варианта оператора new для упрощения OpenMP кода.]]></description>
			<content:encoded><![CDATA[<p>Некоторое время назад я писал в блоге о проблемах, которые возникают при выходе исключения за пределы параллельных регионах. В том числе я рассказал, что исключение может быть сгенерировано оператором new и его необходимо обязательно перехватить и обработать до того, как оно покинет параллельный регион. Конструкции для этого выглядят достаточно неудобно и громоздко. И не так давно мне написали, что в данном случае более изящным решением будет использование оператора new, не генерирующего исключения. То есть использование "nothrow"-варианта оператора new, который возвращает NULL в случае неудачи, позволяет писать более простой <a href="http://www.viva64.com/terminology/OpenMP_rus.html">OpenMP</a> код.</p>
<p>Для знакомства с оператором new, не генерирующем исключений я отсылаю вас к статье "<a href="http://www.viva64.com/go.php?url=259">Nothrow new</a>". А здесь просто приведу два примера, который достаточно ясно продемонстрируют общую идею.</p>
<p>Код с обработкой исключения:</p>
<pre name="code" class="cpp">size_t errCount = 0;
#pragma omp parallel for num_threads(4) reduction(+: errCount)
for(int i = 0; i &lt; 4; i++)
{
  try {
    float *ptr = new float[10000];
    // code
    delete [] ptr;
  }
  catch (std::bad_alloc &amp;)
  {
    ++errCount;
  }
}</pre>
<p>Упрощенный код без обработки исключений:</p>
<pre name="code" class="cpp">size_t errCount = 0;
#pragma omp parallel for num_threads(4) reduction(+: errCount)
for(int i = 0; i &lt; 4; i++)
{
  float *ptr = new(std::nothrow) float[10000];
  if (ptr == NULL) {
    ++errCount;
  } else {
    // code
    delete [] ptr;
  }
}</pre>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/bTcS9ugR3Eo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/03/2002248/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/03/2002248/</feedburner:origLink></item>
		<item>
		<title>Вступление, или о параллельных вычислениях</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/eKO9wdE4A38/</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>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/eKO9wdE4A38" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/02/2002402/feed/</wfw:commentRss>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2009/11/02/2002402/</feedburner:origLink></item>
	</channel>
</rss>
