<?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; Alexander Komarov (Intel)</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/author/alexander-komarov/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/2009/07/10/2001660/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/07/10/2001660/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 08:40:47 +0000</pubDate>
		<dc:creator>Alexander Komarov (Intel)</dc:creator>
				<category><![CDATA[Разработка софта]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/07/10/2001660/</guid>
		<description><![CDATA[Вспоминаю продукты Intel за последние 20 лет. Это и есть новейшая история вычислительной техники. До этого были мифические времена, когда Pat Gelsinger создавал 486, но все (включая его знаменитого научного руководителя ) были уверены, что RISC процессоры победят X86 во всех сегментах. Хотя серверных X86 еще не существовало. Впрочем, тогда я мог лишь узнавать об этом в читальном зале [...]]]></description>
			<content:encoded><![CDATA[<p><span style="RU;" lang="RU">Вспоминаю продукты Intel за последние 20 лет. Это и есть новейшая история вычислительной техники. До этого были мифические времена, когда </span><span style="Verdana;">Pat</span><span style="RU;"> </span><span style="Verdana;">Gelsinger</span><span style="RU;" lang="RU"> создавал 486, но все (включая его знаменитого <a title="Хеннеси" href="http://en.wikipedia.org/wiki/John_L._Hennessy">научного руководителя </a>) были уверены, что RISC процессоры победят X86 во всех сегментах. Хотя серверных X86 еще не существовало. Впрочем, тогда я мог лишь узнавать об этом в читальном зале главной провинциальной библиотеки, а не общаться с архитекторами, как сейчас.</span></p>
<p><span style="RU;" lang="RU">Дизайн процессора всегда был компромиссом. Если известен элемент микроархитектуры, который чаще других оказывается узким местом, его возможности увеличивают. При этом узким местом становится какой-нибудь другой элемент, который до этого им не был. Каждое потенциальное изменение микроархитектуры вниметельно изучается - как оно повлияет на энергопотребление, и на производительность при выполнении набора тестов. Этих тестов сотни. Улучшая производительность на большинстве из них, фича вполне может что-то ломать. Если ухудшается производительность не очень важного теста, то усовершенствование может и войти в финальный степпинг.</span></p>
<p><span style="RU;" lang="RU">Попробую теперь дать определение понятию "грабли микроархитектуры" в контексте этой статьи. "Грабли микроархитектуры" - такая особенность, из-за которой определенный вид кода работает ощутимо хуже, чем мог бы, из-за известного ограничения микроархитектуры. При этом несложно все исправить.</span></p>
<p><span style="RU;" lang="RU">Попытаюсь собрать все грабли последних 20 лет в одном посте. Сложная задача, поэтому буду потихоньку этот пост пополнять.</span></p>
<p><span style="RU;" lang="RU">Микроархитектура P5. Короткий конвейер, первый X86 суперскаляр</span><span style="RU;" lang="RU">. In-order (U/V конвейеры, pairing rules). Грабли - очень дорогие операции умножения и деления, предсказатель переходов сходит с ума от 2 бранчей подряд. Как и 486, внутри - RISC процессор. Поэтому до 486 при оптимизации старались сократить число команд в коде. Теперь приходилось сокращать число микроопераций. Последний процессор, где оптимизировать количество инструкций почти так же полезно, как работу с кэшем. </span></p>
<p><span style="RU;" lang="RU"><span style="RU;" lang="RU">Микроархитектура P6. Конвейер все длиннее и длиннее, суперскаляр все шире, мегагерц все больше.  Изменился static branch bredictor, и если производительность зависела от его поведения в P5 - это грабли. Что-то еще важное было, вспомню - дополню.</span></span></p>
<p><span style="RU;" lang="RU">Микроархитектура NetBurst. Запомнилась людям длиннейшим конвейером, гонкой гигагерц и Trace Cache. Главные эпохальнейшие мегаграбли - 64k aliasing, плавно переходящий, к счастью, в 1M aliasing и наконец 4M aliasing. Кстати, видел у клиента последний раз всего 2 года назад. Неправильное предсказание бранча в критичном цикле тоже могло обозначать грабли, особенно в P4E</span><span style="RU;" lang="RU"><span style="Verdana;">.</span></span></p>
<p><span style="RU;" lang="RU">Core 2. Instruction fetch &amp; predecoding. Грабли - производительность первых стадий конвейера. Если в коде много длинных инструкций - это плохо, совсем как в 486 и P5. Еще грабли - L1 cache line split load.</span></p>
<p><span style="RU;" lang="RU">Nehalem. Идеальный процессор, никаких граблей. (// FIXME AK: дополнить этот абзац, когда выйдет Sandy bridge. Объявить его, в свою очередь, идеальным процессором)</span></p>
<p><span style="RU;" lang="RU">Все многоядерный процессоры: грабли - False sharing. К счастью, не очень сложно обнаружить, и просто исправить.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/07/10/2001660/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Производительность - скидка 10%.</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/07/06/2001625/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/07/06/2001625/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 09:02:09 +0000</pubDate>
		<dc:creator>Alexander Komarov (Intel)</dc:creator>
				<category><![CDATA[Разработка софта]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/07/06/2001625/</guid>
		<description><![CDATA[Если производительность вашего продукта для вас важна, вы, возможно, уже пользуетесь компилятором Intel. При компиляции продукта можно пользоваться разными ключиками, их десятки. Лично я почти всегда начинаю с четырех - -O1/2/3, -xArch, -ip[o], -prof_use. Последний в этом списке - крайне полезный ключик, который удивительно редко используется. Этот ключик называется PGO - Profile Guided Optimization. Он существенно усложняет [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="0cm 0cm 0pt;"><span style="RU;" lang="RU">Если производительность вашего продукта для вас важна, вы, возможно, уже пользуетесь компилятором </span><span style="EN-GB;" lang="EN-GB">Intel</span><span style="RU;" lang="RU">. При компиляции продукта м</span><span style="RU;" lang="RU">ожно пользоваться разными ключиками, их десятки. Лично я почти всегда начинаю с четырех - -O1/2/3, -xArch, -ip[o], -prof_use.</span><span style="RU;" lang="RU"> Последний в этом списке - крайне полезный ключик, который удивительно редко используется.</span></p>
<p class="MsoNormal" style="0cm 0cm 0pt;"><span style="RU;" lang="RU">Этот ключик называется PGO - Profile Guided Optimization. Он существенно усложняет процесс компиляции - при его использовании компилировать проект придется 2 раза. Первый раз - для создания продукта, инструментированного специальным кодом, собирающим статистику, необходимую для улучшения производительности. Второй раз - собственно для создания бинарника. В промежутке между этими двумя сборками, требуется запустить бинарник/библиотеку, собранную при первой компиляции, под типичной нагрузкой. В результате бранчи станут лучше предсказываться, функции правильно инлайнится, кэш и регистры - эффективнее использоваться, и т.д.</span></p>
<p class="MsoNormal" style="0cm 0cm 0pt;"><span style="RU;" lang="RU">Звучит сложно. Человек, отвечающий за Sotware Configuration Management/Build scripts, будет рад дополнительной работе <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . К счастью, это все достаточно делать лишь для Release Candidate сборок.</span></p>
<p class="MsoNormal" style="0cm 0cm 0pt;"><span style="RU;" lang="EN-GB"><span style="yes;">Зачем вообще городить этот огород? Вот зачем. </span></span><span style="RU;" lang="RU">Я показывал, как пользоваться </span><span style="EN-GB;" lang="EN-GB">PGO</span><span style="RU;" lang="EN-GB"> </span><span style="RU;" lang="RU">уже многим клиентам, на примере десятков приложений (штук 20 минимум). И я еще ни разу не наблюдал прироста производительности меньше 10%. Можно сказать, совершенно нахаляву - то есть почти даром. Достаточно один раз переписать build scripts.</span></p>
<p class="MsoNormal" style="0cm 0cm 0pt;"><span style="RU;" lang="RU">Правда, сильно больше 10% прироста тоже не видел. Подозреваю, что я на пороге открытия нового закона природы, универсальной мировой константы, которая пополнит неполный в настоящее время ряд из числа пи, основания натурального логарифма</span><span style="RU;" lang="RU">, заряда электрона</span><span style="RU;" lang="RU">, постоянной планка, скорости света в вакууме, ...</span><span style="RU;" lang="RU">.</span></p>
<p class="MsoNormal" style="0cm 0cm 0pt;"><span style="EN-GB;" lang="EN-GB">Знакомьтесь : постоянная производительности PGO - 1.1111111111111 <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Если у вас получается на реальном приложении (не micro-benchmark), сильно меньше или сильно больше 10%, дайте знать, пожалуйста <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p>И, кстати, Profile Guided Optimization поддерживается не только компилятором Intel, а всеми основными компиляторами. Правда, в разном объеме. Даже в JVM, например, в Harmony JIT есть нечто подобное.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/07/06/2001625/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Однопоточная производительность.</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/06/25/2001581/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/06/25/2001581/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 16:55:20 +0000</pubDate>
		<dc:creator>Alexander Komarov (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/06/25/2001581/</guid>
		<description><![CDATA[Бывает, что очень нужно совершенно любой ценой получить максимальную производительность на одном потоке. Это необязательно HPC приложение (как раз HPC вендоры всегда умели находить и использовать параллелизм почти в любой задаче). И вот, партия сказала : надо. Надо показать как можно больше попугаев в задаче X. Комсомол ответил : есть. Все как полагается.  Начать следует с [...]]]></description>
			<content:encoded><![CDATA[<p>Бывает, что очень нужно совершенно любой ценой получить максимальную производительность на одном потоке. Это необязательно HPC приложение (как раз HPC вендоры всегда умели находить и использовать параллелизм почти в любой задаче).</p>
<p>И вот, партия сказала : надо. Надо показать как можно больше попугаев в задаче X. Комсомол ответил : есть. Все как полагается.  Начать следует с выбора железа. Так как можно выбирать любую машинку,  сразу же напрашивается идея взять последнюю модель Xeon 7xxx серии или даже 9xxx, добавить 128 гигабайт оперативки, и попугаи бенчмарка будут довольны. Как раз тот случай, о котором говорят, что у любой сложной проблемы есть простое, очевидное и неправильное решение.</p>
<p>Правильное решение - это сначала погонять программку под Intel Vtune, Intel Performace Tuning Utility. Понять, что и насколько ей важно для производительности - частота ядра, размер кэша второго уровня, третьего, DTLB, пропускная способность памяти, latency. При этом нет особенной необходимости тестировать на всем доступном зоопарке. Обычно достаточно сделать кучу измерений на обычной, но достаточно мощной машинке - вроде рабочей станции на Xeon X5570 с 16 гигами оперативки у меня под рабочим столом.</p>
<p>Turbo Boost очень пригодится в любом случае. 266 добавочных мегагерц лишними не будут. Если программа очень любит memory latency, тогда лучший выбор - последняя модель односокетного Xeon, например W3570 (естественно, с правильно подобранной частотой памяти). Если важен быстрый L1 Cache - X5492. Если большой L2 кэш, доступный одному процессу - тоже X5492. Большой L3 кэш - E7440 или хотя бы X5570.</p>
<p>Ну а уже на самом подходящем для задачи железе можно дальше увеличивать количество попугаев - играть с настройками ОС, Intel compiler, приложением.</p>
<p>И напоследок свежий анекдот о микроархитектуре CPU. Только что коллега-немец рассказал, что недавно видел попытку перевести термин "Out of Order Engine" на немецкий язык. Получилось - "капут машина" <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/06/25/2001581/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Еще о битиках, байтиках и циклах CPU.</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/06/19/cpu-2/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/06/19/cpu-2/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 10:43:01 +0000</pubDate>
		<dc:creator>Alexander Komarov (Intel)</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/06/19/cpu-2/</guid>
		<description><![CDATA[После замечательного отпуска длиной в полтора года, проведенного в Новой Зеландии (фотки), могу с новыми силами приняться за блог Спасибо коллегам, которые помогли вспомнить пароль. Итак, снова немножко об оптимизации. Недавно для клиента надо было улучшить производительность одного редкого алгоритма шифрования... Если бы клиент пользовался AES, можно было бы с [почти] чистой совестью посоветовать дождаться Westmere, где есть [...]]]></description>
			<content:encoded><![CDATA[<p>После замечательного отпуска длиной в полтора года, проведенного в Новой Зеландии (<a title="фотки НЗ" href="http://izard.livejournal.com/24024.html" target="_blank">фотки</a>), могу с новыми силами приняться за блог <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Спасибо коллегам, которые помогли вспомнить пароль.</p>
<p>Итак, снова немножко об оптимизации.</p>
<p>Недавно для клиента надо было улучшить производительность одного редкого алгоритма шифрования... Если бы клиент пользовался AES, можно было бы с [почти] чистой совестью посоветовать дождаться Westmere, где есть аппаратная поддержка его ускорения, и посоветовать использовать библиотеку, которая использует соответствующие инструкции. Если бы это был какой-нибудь популярный алгоритм, можно было бы посоветовать IPP - вряд ли бы удалось сделать быстрее, к тому же стоит недорого, не надо платить royalty, и автоматически появляется поддержка всех новых процессоров.</p>
<p>Однако алгоритм редкий, и пришлось разбираться, что можно сделать. Во-первых, очевидно, распараллелить. Но для блочного шифрования это не самая сложная часть. Сложнее увеличить отдачу от каждого ядра.</p>
<p>В алгоритме шифруются блоки из 64 бит, причем происходит много битовых операция внутри 16 битных слов. Первое дело при анализе производительности блочного алгоритма шифрования - проверить, имеет ли смысл использовать <a title="Bit slicing" href="http://en.wikipedia.org/wiki/Bit_slicing">bit slicing</a>. Очень удобно, что в процессоре есть 128 битные SSE регистры, и быстрые операции с ними.</p>
<p>Суть bit slicing в том, что можно взять 128 64-битных блоков, транспонировать в 64 128-битных регистра. Тогда в первом SSE регистре будут только первые битики 128 блоков, во втором - вторые, и т.д. Кстати, ключ/ключи тоже лучше транспонировать. После транспонирования, дорогие битовые операции над 16-битными словами внутри блока становятся дешевыми переименованиями регистров, причем каждая операция сразу влияет на все 128 блоков. Правда, дешевые S-box меняются на цепочку логическких операций. После шифрования, результат приходится транспонировать обратно.</p>
<p>Немного напоминает по идеологии преобразования Лапласа, не так ли <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ? Результат зависит от протокола, у меня получилось ускорение в 7 раз.</p>
<p>Но что, если 128 блоков подряд найти нельзя? например, если шифруется TCP/IP сессия, и 128 блоков - заведомо больше окна? Тогда может помочь вторая идея - <a title="Software pipelining" href="http://en.wikipedia.org/wiki/Software_pipelining">software pipelining</a>. Можно попытаться все действия совершать сразу над 2 словами - одно из одного блока, и одно (аналогичное) из следующего. За счет уменьшения <a title="Clocks per Instruction" href="http://en.wikipedia.org/wiki/Clock_cycle">CPI</a> (мера эффективности эксплуатации параллелизмы на уровне микроопераций конвейером) можно тоже получить прирост производительности. У меня получился на 30%.</p>
<p>А ведь еще есть интересные возможности о замене части операций loookup-ами по большим таблицам. (память дешевая, кэш большой, есть software prefetches). Вот где раздолье любителям порассчитывать циклы CPU и латентности кэшей!</p>
<p>Happy hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/06/19/cpu-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Способы параллелизации</title>
		<link>http://software.intel.com/ru-ru/blogs/2007/10/26/25/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2007/10/26/25/#comments</comments>
		<pubDate>Fri, 26 Oct 2007 10:02:14 +0000</pubDate>
		<dc:creator>Alexander Komarov (Intel)</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2007/10/26/25/</guid>
		<description><![CDATA[Как и обещал, напишу о различных подходах, помогающих параллелизации. Странно, но я не видел обзора всех доступных программисту возможностей в одном месте. (Кто видел, киньте ссылку в комментах, пожалуйста!) Win threads, PThreads Программист управляет всем, чем можно. Умелый программист, потратив много сил, получит корректную программу. Потратив еще много сил, получит корректную масштабирующуюся программу. И т.д. [...]]]></description>
			<content:encoded><![CDATA[<p>Как и обещал, напишу о различных подходах, помогающих параллелизации. Странно, но я не видел обзора всех доступных программисту возможностей в одном месте. (Кто видел, киньте ссылку в комментах, пожалуйста!)</p>
<p>Win threads, PThreads</p>
<p>Программист управляет всем, чем можно. Умелый программист, потратив много сил, получит корректную программу. Потратив еще много сил, получит корректную масштабирующуюся программу. И т.д.</p>
<p><a href="http://www.openmp.org/drupal/">OpenMP</a></p>
<p>Если вам повезло с задачей (или просто вы пишите курсовую по методом мат. вычислений), то это идеальный способ посчитать все быстро на вашем домашнем Quad Core Extreme Edition CPU <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Если серьезно, я относился к OpenMP всегда очень скептически, но все чаще начинаю использовать ее для прототипов в самых неожиданных задачах.</p>
<p><a href="http://www.boost.org/">Boost </a>Threads</p>
<p>Единственный потенциально 100% портируемый С++ вариант. Больше преимуществ на первый взгляд не заметно.</p>
<p><a href="http://www.cs.wustl.edu/~schmidt/ACE.html">Ace </a>Threads</p>
<p>Я бы не стал включать в список, но некоторые мои клиенты его успешно используют...</p>
<p><a href="http://www.intel.com/software/products/tbb">Intel TBB</a></p>
<p>Здесь должна быть неприкрытая, наглая и лживая реклама <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Правда, я очень люблю TBB, и считаю ее дизайн просто великолепным. К сожалению, я опасаюсь, что у нас может не получится должным образом ее продвинуть на рынок. (Что хорошо получается с процессорами, не всегда происходит с остальными продуктами). Пожалуйста, обратите внимание на этот продукт - он может существенно облегчить распараллеливание в тех задачах, в которых применим.</p>
<p>Ct</p>
<p>Даже линка нет, настолько секретная. Но Гугл вам в помощь. Может оказаться очень полезной года через 2, а может и нет...</p>
<p>MPI.</p>
<p>Несмотря на то, что MPI используется обычно для HPC задач в кластерах, в последнее время есть тенденция использовать message passing параллелизацию и в многоядерных решениях, в том числе, например, создавая кластера из виртуальных машин.</p>
<p>(pre-MPI)</p>
<p>Экзотические. Я имею в виду не C/C++/Fortran, а Erlang, параллельный Хаскель, и тому подобные. Могут быть страшно эффективны, но как найти команду программистов, с ними справляющихся?</p>
<p>Transactional memory.</p>
<p>Жутко модная вещь, многие считают, что за ней - будущее. Мое личное мнение (просто сугубое ИМХО), 80% коллег со мной не согласятся: Будущее очень отдаленное, и то вряд ли.</p>
<p>Кстати, это мой последний пост, к сожалению. Всем удачи, мой личный блог - <a href="http://izard.livejournal.com">вот</a>, я уезжаю в Новую Зеландию работать в <a href="http://www.endace.com">стартапе</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2007/10/26/25/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Зачем нам был нужен HT?</title>
		<link>http://software.intel.com/ru-ru/blogs/2007/09/27/ht/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2007/09/27/ht/#comments</comments>
		<pubDate>Fri, 28 Sep 2007 04:36:12 +0000</pubDate>
		<dc:creator>Alexander Komarov (Intel)</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2007/09/27/ht/</guid>
		<description><![CDATA[Уважаемые читатели, прошу прощения за задержку с обещанным постом о классификации параллельных библиотек. Я обнаружил, что своровать скомпилировать перевести его с каких-нибудь англоязычных источников невозможно за неимением таковых. Так что напишу пока еще один акын. Вчера в Новосибирске на дне разработчика Microsoft мне задали вопрос о reverse hyperthreading. Появилась такая утка месяцев 10 назад, и связана была с [...]]]></description>
			<content:encoded><![CDATA[<p>Уважаемые читатели, прошу прощения за задержку с обещанным постом о классификации параллельных библиотек. Я обнаружил, что <strike>своровать</strike> <strike>скомпилировать</strike> перевести его с каких-нибудь англоязычных источников невозможно за неимением таковых. Так что напишу пока еще один акын. Вчера в Новосибирске на <a href="http://www.microsoft.com/Rus/events/detail.mspx?eventid=1032350550">дне разработчика Microsoft</a> мне задали вопрос о reverse hyperthreading. Появилась такая утка месяцев 10 назад, и связана была с не совсем корректной интерпритацией одной фичи. Фича заключается в том, что в некоторых 2-х ядерных процессорах возможно отключение одного из ядер, с тем, чтобы оставшееся можно было разогнать по частоте не поднимая энергопотребления/выделения тепла. Действительно, есть классы алгоритмов, которые вообще не параллелятся, и, насколько мне известно, эта возможность реально применяется лишь для небольшого класса HPC приложений.</p>
<p>Но недавно я услышал от одного клиента совсем другую причину отключения второго ядра. "Мы считаем", говорил архитектор, "что у нас есть несколько не пойманных data-race'ов. Требования к надежности софта очень серьезные, поэтому мы отключим второе ядро в BIOS." Речь идет о встроенном ПО, управляющим ответственной системой, которой пользуются опосредованно все читатели этого блога. Кстати, работает софт под Windows XP. Конечно я оветил: "позвольте, но вы рекомендуете клиентам использовать P4 с Hyperthreading, так что основные data-race'ы должны были уже проявиться в ваших тестах. Плюс ваш софт написан на С++, и Thread Checker'ом их все можно поймать очень быстро"</p>
<p>Так вот, о чем это я: Hyper Threading на P4 - был гениальным нововведеним, которое для хорошо написанного софта не создавало ничего, кроме проблем с отладкой. Зато те многопоточные рограммы, которые еще тогда, 5 лет назад, стабильно работали на P4 с неотключенным HT (а многие - отключали), теперь спокойно и без дополнительной отладки работают на core 2 duo. Тем же, кто поленился тестироваться с HT - придется теперь это делать все равно. Или просить пользователя отключать второе ядро, но на это пойдет только самоубийца, или производитель встроенного ПО.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2007/09/27/ht/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ИИ и параллелизация</title>
		<link>http://software.intel.com/ru-ru/blogs/2007/07/23/22/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2007/07/23/22/#comments</comments>
		<pubDate>Tue, 24 Jul 2007 06:40:58 +0000</pubDate>
		<dc:creator>Alexander Komarov (Intel)</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2007/07/23/22/</guid>
		<description><![CDATA[Представьте себе черный ящик, получающий на вход сообщения, как-то их обрабатывающий (общаясь при этом с базой даных), и посылающий ответные сообщения. Можно догадаться, что я описал допотопный Application Server.  Сколько таких работает в боевых условиях? Не счесть. Многие из них  содержат мало документированную бизнес-логику, закодированную десятками программистов в течение многихлет. Команда, поддерживающая такого зверька, возносит Ктулху [...]]]></description>
			<content:encoded><![CDATA[<p><font face="Times New Roman">Представьте себе черный ящик, получающий на вход сообщения, как-то их обрабатывающий (общаясь при этом с базой даных), и посылающий ответные сообщения. Можно догадаться, что я описал допотопный Application Server.  Сколько таких работает в боевых условиях? Не счесть. Многие из них  содержат мало документированную бизнес-логику, закодированную десятками программистов в течение многихлет. Команда, поддерживающая такого зверька, возносит Ктулху лишь одну молитву: только бы не пришлось вводить новое правило, которое может все обрушить.</font></p>
<p><font face="Times New Roman">Я вообще интересуюсь развитием ИИ, но редко (никогда в моем опыте) используются эти технологии в индустриальном программировании. И вот, один клиент разрабатывает интересную систему, позволяющую избавиться от кошмара поддержки древнего app server'a, написанного, скажем, на COBOL'е. </font></p>
<p><font face="Times New Roman">Как это работает? Сначала "Очень Умный Аналитик" составляет Onthology. На вход системы, базу данных и ее выход ставится сниффер. Результаты, вместе с онтологией, скармливаются "Очень Умному ИИ".  Он пытается все понять, и, естественно, не может.  Задает огромное количество вопросов "Очень Умному Аналитику". Потом успокаивается, и производит код, способный имитировать первоначальную систему. </font></p>
<p><font face="Times New Roman">Слишком хорошо, чтобы быть правдой? Уже есть несколько клиентов, и процесс внедрения занял человеко-месяцы, а не человеко-годы, которые ушли бы на создание аналогичной системы с нуля. Это подтверждает заявленные разработчиками возможности.</font></p>
<p><font face="Times New Roman">При чем здесь многоядерность? Часто код оказывается производительней оригинального. Не только потому, что оригинальный просто потяжелел и распух от многих лет жизни. А потому, что иногда удается автоматически распараллелить получившийся код.</font></p>
<p><font face="Times New Roman">Вообще, намечается очередное увлечение Domain Specific Languages (как в 70-80 все производители Больших Телефоных Свитчей писали свой Pascal, ( а выжил только Erlang) ). В этой системе он тоже есть (описание онтологии и общение с аналитиком в ее терминах).</font></p>
<p><font face="Times New Roman">В следующем посте: О различных системах распараллеливания существующих программ. (к сожалению, пока все они "заточены" на узкий класс приложений, в-основном HPC ( за исключением разве что Azul, но и оно имеет узкую нишу))</font></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2007/07/23/22/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Занимательная масштабируемость</title>
		<link>http://software.intel.com/ru-ru/blogs/2007/07/04/1/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2007/07/04/1/#comments</comments>
		<pubDate>Wed, 04 Jul 2007 16:11:45 +0000</pubDate>
		<dc:creator>Alexander Komarov (Intel)</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2007/07/04/1/</guid>
		<description><![CDATA[На одном интересном сайте недавно появилась статья об диагностике проблем с масштабируемостью. Автор - Дэвид Левенталь, признанный специалист по низкоуровневым оптимизациям и производству коллекционного вина. Статья посвящена диагностике микроархитектурных проблем. У Intel Software College есть подробный курс на эту тему, с лабами, часа на 4. Но можно почитать и статью, которая объясняет некоторые самые важные тонкости. Но так ли [...]]]></description>
			<content:encoded><![CDATA[<p>На одном интересном <a href="http://www.devx.com/go-parallel/Door/32532">сайте</a> недавно появилась <a href="http://assets.devx.com/goparallel/19491.pdf">статья</a> об диагностике проблем с масштабируемостью. Автор - Дэвид Левенталь, признанный специалист по низкоуровневым оптимизациям и производству коллекционного вина. Статья посвящена диагностике микроархитектурных проблем. У <a href="http://or1cedar.cps.intel.com/softwarecollege/coursecatalog.asp">Intel Software College</a> есть подробный курс на эту тему, с лабами, часа на 4. Но можно почитать и статью, которая объясняет некоторые самые важные тонкости.</p>
<p>Но так ли нужно понимание этих нетривиальных деталей, если приложение, например, перестает масштабироваться после добавления более 4 потоков? Часто все оказывается намного проще. Например, зимой я работал с серверным приложением, которое очень хорошо масштабировалось до 6 потоков, но при дальнейшем их увеличении производительность серьезно падала.</p>
<p>Intel Thread Profiler не помог выяснить проблему. Потоки были практически независимы. Микроархитектурных узких мест, описанных в статье выше, обнаружить не удалось. Дальнейший анализ при помощи Vtune показал, что серьезно возрастает время, проведенное в gettimeoftheday. В этой функции ядра вроде-бы и нет вызовов объектов синхронизации. К счастью, можно было не особенно вникать в детали реализации gettimeoftheday. Была возможность вызывать ее на порядок реже, увеличив число потоков до 8 (именно столько ядер в типовом современном двухпроцессорном сервере).</p>
<p>Не люблю рекламу пива Клинское, но приходится признать, что в некоторых вещах действительно сперва обойтись без понтов. (См. мой опыт с Thread Profiler и попытки отыскать низкоуровневые задержки.)</p>
<p>Удачной отладки!</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2007/07/04/1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Слишком хорошая виртуализация</title>
		<link>http://software.intel.com/ru-ru/blogs/2007/06/21/3/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2007/06/21/3/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 11:56:58 +0000</pubDate>
		<dc:creator>Alexander Komarov (Intel)</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2007/06/21/3/</guid>
		<description><![CDATA[Существуют два класса серверных приложений - те, которым уже достаточно CPU ресурсов, и те, авторы которых каждую неделю с нетерпением смотрят на календарь и roadmap производителей процессоров. К счастью для прогресса (и не только), программ второго типа все-таки больше. Однако новые возможности процессоров могут оказаться полезными и для приложений первого типа.Если 1-2 ядра из 4-16 [...]]]></description>
			<content:encoded><![CDATA[<p>Существуют два класса серверных приложений - те, которым уже достаточно CPU ресурсов, и те, авторы которых каждую неделю с нетерпением смотрят на календарь и roadmap производителей процессоров. К счастью для прогресса (и не только), программ второго типа все-таки больше.</p>
<p>Однако новые возможности процессоров могут оказаться полезными и для приложений первого типа.Если 1-2 ядра из 4-16 приложению достаточно, то запустив несколько виртуальных машин с похожими приложениями, можно использовать вычислительные ресурсы более эффективно. Надежному разделению ОС помогает аппаратная поддержка виртуализации - VT, технология, которую Intel впервые выпустил на рынок еще в конце 2005-го.</p>
<p> Недавняя статья на <a href="http://worsethanfailure.com/Articles/The_Harbinger_of_the_Epoch_.aspx"><font color="#002bb8">WorseThenFailure</font></a> напомнила мне разговор об end-of-epoch-bug. Мы беседовали за пивом с архитектором одной системы, созданной в 70-е, как и Unix, с которой он любит ее сравнивать. Она почти так же распространена, но гораздо менее известна. К сожалению, я не могу ее здесь назвать. Счетчик времени в этой ОС переполнится в 2104 году, а баги по типу описанного по ссылке выше начнут проявляться несколько раньше.Код ядра системы давно никто не трогал, она пережила 5 процессорных архитектур, и сейчас работает в виртуальной машине в виртуальной машине, исполняющейся на платформе Intel. Вполне эффективно работает, лишь бы не трогать громадный старый отлаженный код на языке, который уже мало кто помнит.</p>
<p>И вот наступает 2104 год... В 2038 году будет достаточно людей, которые понимают, почему "тот сервер, замурованный в углу в 2020'м году, в котором где-то глубоко находится RHEL3, выполняющийся в виртуальной 32-битной машине, стал вдруг глючить". Может быть, даже индустрия появится, по опыту 2000-го. Но до 2104 лично я дожить не надеюсь, хотя я самый молодой инженер из тех, кто знает о проблеме. Конечно, к тому времени системы может и перестать использоваться, или нас вообще завоюют роботы.</p>
<p>Последнее, по-моему, вероятнее.Вот такой недостаток виртуализации, которая вроде-бы всем хороша.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2007/06/21/3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

