<?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; Maxym Dmytrychenko (Intel)</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/author/maxym-dmytrychenko/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>OpenCL и оптимизация</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/09/19/opencl/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/09/19/opencl/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 11:14:42 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[openCL]]></category>
		<category><![CDATA[OpenCL offline compiler]]></category>
		<category><![CDATA[OpenCL SDK]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/09/19/opencl/</guid>
		<description><![CDATA[Оптимизация для OpenCL –  достаточно трудоемкое дело, на эту тему можно защитить диссертацию,  написать книгу-бестселлер и сказочно разбогатеть ;) . Я же начну свой путь к богатству скромно, c поста в блоге.]]></description>
			<content:encoded><![CDATA[<p>OpenCL появился относительно недавно, но уверенно завоевывает сердца и умы разработчиков. Некоторое время назад Интел выпустил собственную реализацию OpenCL  –  Intel® OpenCL SDK. Проект активно развивается и в данный момент на <a href="http://software.intel.com/en-us/articles/opencl-sdk/">домашней странице</a> проекта доступна для скачивания версия <a href="http://software.intel.com/en-us/articles/opencl-release-notes/">1.1</a>.</p>
<p>Оптимизация для OpenCL –  достаточно трудоемкое дело, на эту тему можно защитить диссертацию,  написать книгу-бестселлер и сказочно разбогатеть <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  . Я же начну свой путь к богатству скромно, c поста в блоге. Ниже предполагается, что у читателя уже есть базовое представление об OpenCL, SDK загружен и Hello World написан.</p>
<p>Сегодня хотелось бы отметить приложение, которое поставляется с Intel® OpenCL SDK и имя ему Intel® OpenCL Offline Compiler (x64).</p>
<p>Можно найти несколько реальных применений этому приложению, основная цель которого –   компиляция исходного OpenCL кода в код, который OpenCL runtime часть уже способна исполнять.</p>
<p>Сам Offline Compiler выглядит так:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/opencl_offline-compiler-big.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/opencl_offline-compiler-small.png" alt="Intel(R) OpenCL Offline Compiler" /></a><br />
<em>Пример Offline Compiler с загруженым OpenCL кодом.</em></p>
<p>OpenCL код (слева) после компиляции (в нижнем окне виден отчет о успешной или не очень компиляции) можно просмотреть в виде некого LLVM (<a href="http://en.wikipedia.org/wiki/Low_Level_Virtual_Machine">Low Level Virtual Machine</a>)  байт-кода, или в более традиционном виде x86 ассемблерных инструкции (справа).</p>
<p>На что в этом топике хотелось бы обратить внимание, –  наш изначальный код ( addLevel2 ) в виде инструкций уже показан в двух версиях. В обеих –  функционально полный и правильный:</p>
<ul>
<li>простой ( @addLevel2 ) скалярный/поэлементный.</li>
<li>более продвинутый (@__Vectorized_AddLevel2 ) векторизованный.</li>
</ul>
<p>Получается, что компилятор уже на данном уровне пытается создать два пути для кода. А вот выбор варианта, т.е. какой именно путь будет использован во время исполнения программы, лежит на плечах эвристики и в момент исполнения.</p>
<p>Таким образом, довольно быстро, на этапе написания, можно оценить потенциальные возможности и производительность кода. Ведь мы знаем, что векторизация, как правило, приносит значительное ускорение по сравнению с поэлементными операциями.</p>
<p>Надеюсь, у вас уже появились вопросы по OpenCL. Не стесняйтесь оставлять их в комментариях –  обсудим!</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/09/19/opencl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Встречаем архитектуру Haswell и AVX2.0</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/07/25/haswell-avx20/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/07/25/haswell-avx20/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 14:41:19 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[AVX]]></category>
		<category><![CDATA[AVX 2.0]]></category>
		<category><![CDATA[Haswell]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/07/25/haswell-avx20/</guid>
		<description><![CDATA[Каждая новая процессорная архитектура привносит какие-то новшества. Иногда это касается только «внутренней кухни», вроде техпроцесса, планировщика и КЭШей. Такие изменения, как правило, вызывают бурные обсуждения среди всяческих аналитиков, но простых программистов заботят мало. Далеко не каждый способен представить, скажем, как отреагирует механизм предсказания переходов на изменение пары строчек внутри цикла. Как говорил классик «я знаю только то, что мне необходимо, и не собираюсь забивать голову ненужным хламом». Однако, время от времени изменения касаются святая святых - набора команд процессора. И вот тут появляется пространство для маневра, который может привести к ускорению кода в разы. Как многие уже знают, не стала исключением и архитектура SandyBridge, процессоры на базе которой появились в начале этого года. Именно в них появился набор инструкций Intel® AVX (Advanced Vector Instructions). 

Между тем, прогресс не стоит на месте и уже вовсю кипит работа над новым набором команд!]]></description>
			<content:encoded><![CDATA[<p>Каждая новая процессорная архитектура привносит какие-то новшества. Иногда это касается только «внутренней кухни», вроде техпроцесса, планировщика и КЭШей. Такие изменения, как правило, вызывают бурные обсуждения среди всяческих аналитиков, но простых программистов заботят мало. Далеко не каждый способен представить, скажем, как отреагирует механизм предсказания переходов на изменение пары строчек внутри цикла. Как говорил классик «я знаю только то, что мне необходимо, и не собираюсь забивать голову ненужным хламом». Однако, время от времени изменения касаются святая святых - набора команд процессора. И вот тут появляется пространство для маневра, который может привести к ускорению кода в разы. Как многие уже знают, не стала исключением и архитектура SandyBridge, процессоры на базе которой появились в начале этого года. Именно в них появился набор инструкций Intel® AVX (Advanced Vector Instructions).</p>
<p>По своей сути AVX, как и его предшественник, SSE, предлагает решение проблемы векторизации. Принцип, заложенный в векторные инструкции процессоров, заключается в упаковке обрабатываемых данных в некий стандартный для железа вид, что само по себе может быть очень выгодно с точки зрения скорости – за один присест обрабатывается сразу несколько значений. Разумеется, за все нужно платить: в нашем случае такой «платой» является соблюдение ряда условий, одно из которых - использование только тех типов данных, для которых оптимизировано «железо». Впрочем, это тема отдельного разговора.</p>
<p>AVX как "первый блин" не вышел комом, но прогресс не стоит на месте и уже вовсю кипит работа над новым набором команд. Через каких-нибудь пару лет  можно будет купить новенький процессор базе архитектуры «Haswell». Как это принято в Intel, название архитектуры взято с географической карты, а если быть более точным, - с карты штата Колорадо. Но нас интересует отнюдь не география, а новый набор команд AVX 2.0. </p>
<p>Можно долго углубляться  в детали и инструкции AVX 2.0, но начнем с главного:</p>
<ul>
<li>AVX способности распространились на целочисленные (integer ) типы и операции с ними.</li>
<li>Появились инструкции, позволяющие делать GATHER тип операций; при таких операциях не требуется, чтобы данные находились в непрерывных участках памяти.</li>
<li>FMA (Fused Multiply-Add) - одна инструкция выполняет несколько операций над упакованными данными.</li>
<li>Добавлены специализированные инструкции по манипуляции битов.</li>
</ul>
<p>Нововведения выглядят многообещающе. В особенности с точки зрения увеличения количества задач, хорошо ложащихся на новые инструкции. Многое из AVX 2.0 еще в проработке, но уже опубликованы некоторые ключевые спецификации и продукты, которые позволяют опробовать новые инструкции, и, скажем так, морально к ним  подготовиться.</p>
<p>В подготовке поможет SDE, софтверный эмулятор новых инструкций, доступный для загрузки с этой страницы: <a href="http://software.intel.com/en-us/articles/intel-software-development-emulator/">http://software.intel.com/en-us/articles/intel-software-development-emulator/</a></p>
<p>Для компиляции исходников стоит посмотреть на ранние сборки GCC 4.7.</p>
<p>И самое главное – документация! Первая спецификация (действительно первая публичная спецификация) доступна вот тут - <a href="http://software.intel.com/en-us/blogs/2011/06/13/haswell-new-instruction-descriptions-now-available/">http://software.intel.com/en-us/blogs/2011/06/13/haswell-new-instruction-descriptions-now-available/</a>. Владеющим английским также рекомендуется к прочтению вводная статья <a href="http://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions/">Introduction to Intel® Advanced Vector Extensions</a>. </p>
<p>В следующем посте постараюсь погрузиться в тему AVX, а пока буду рад ответить на ваши вопросы!</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/07/25/haswell-avx20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Оптимизируем… Колесо. На кластере.</title>
		<link>http://software.intel.com/ru-ru/blogs/2010/02/09/2003071/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2010/02/09/2003071/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 11:49:15 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Академическое сообщество]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[HPC]]></category>
		<category><![CDATA[Top 500]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2010/02/09/2003071/</guid>
		<description><![CDATA[Я думаю, что иногда стоит рассказать, а еще лучше - показать, зачем нужна вся эта мощь вычислений нам, простым людям. Станет ли жизнь лучше, если суперкомпьютер изобретет новое колесо или поможет правильнее описать происхождение насекомых ?]]></description>
			<content:encoded><![CDATA[<p>Если академическая среда уже понимает необходимость, но еще нуждается в представлении, как все это использовать эффективно, то вне этой среды пока не совсем ясно кому собственно надо такое направление как HPC (High Performance Computing). Как кто-то и когда-то говорил: если ученый не может объяснить постороннему человеку, чем именно он занимается, - это уже проблема, как минимум самого ученого.</p>
<p>На самом деле, опуская технику программирования с использованием MPI/OpenMP и т.д., кому нужны большие вычислительные ресурсы, описанные, например, тут <a href="http://parallel.ru/russia/russian_clusters.html">parallel.ru/russia/russian_clusters.html</a>? Что именно считают на гигантах из этого списка - <a href="http://www.top500.org">www.top500.org</a>?</p>
<p>Top 500 еще как-нибудь показывает срезы использования в "Областях применения" ( <a href="http://www.top500.org/charts/list/34/apparea">Application Area</a>), что, конечно, помогает составить некое представление, но…  как узнать больше?</p>
<p>Ответ есть, причем довольно хорошо описанный и на большом количестве примеров. Рекомендую посмотреть вот на эту страницу <a href="http://hpc-russia.ru/book_ready.html">hpc-russia.ru/book_ready.html</a></p>
<p>И как вывод - вопрос о колесе перестанет быть вопросом, ответ разочарует очевидностью, и главное - необходимостью действовать уже сейчас.</p>
<p>Теперь, когда под рукой множество примеров успешного применения HPC, стоит только добавить, что вопросы технической реализации программирования подобных суперкомпьютеров - это несколько более объемный материал. Ну и главный вывод: люди в академической среде проявляют к HPC довольно сильный и стабильный интерес, что само по себе довольно интересный факт.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2010/02/09/2003071/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVX debugging или все-таки как?</title>
		<link>http://software.intel.com/ru-ru/blogs/2010/01/29/avx-debugging/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2010/01/29/avx-debugging/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 19:25:50 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Открытый код]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Intel AVX]]></category>
		<category><![CDATA[Intel SDE]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2010/01/29/avx-debugging/</guid>
		<description><![CDATA[Замыкаем круг разработки и практически визуально]]></description>
			<content:encoded><![CDATA[<p>AVX определен, зафиксирован и уже идет к нам. Ранее много говорилось о разных способах разработки: компиляция, эмуляция, документация и даже профайлинг (очень рекомендую заглянуть сюда <a href="http://software.intel.com/en-us/avx/">http://software.intel.com/en-us/avx/</a> ), – но довольно мало было информации по поводу отладки.</p>
<p>Хотя, если сказать честно – все уже было. Но сегодня стало еще удобнее и даже нагляднее отлаживать перемещение битов по 256 битному полю AVX регистров.</p>
<p>В общем, рекомендую ближе познакомиться с SDE (<a href="http://software.intel.com/en-us/articles/intel-software-development-emulator">http://software.intel.com/en-us/articles/intel-software-development-emulator</a> ).</p>
<p>Эмулятор позволяет не только отлично, но и тихо обрабатывать набор всех инструкций, а также показывать, что именно происходило.</p>
<p>Для начала хочу обратить ваше внимание на дополнительный аргумент помощи  - thelp, который раскрывается в довольно длинный набор аргументов, среди которых можно найти и так называемые Debugtrace knobs, где отдельно стоит отметить -debugtrace и -dt_start_int3.</p>
<p>Их использование позволяет нам создать файл отчета debugtrace.out ( имя по умолчанию ), где будут явно видны команды и, главное, их операнды с используемыми значениями.</p>
<p>У меня, например, получается:</p>
<blockquote><p><code>
<p>TID0: INS 0x00401f4d                     vrcpss xmm7, xmm5, xmm5</p>
<p>TID0:      XMM7 := 00000000_00000000_00000000_3ba57800</p>
<p>XMM7 (doubles) := 0 4.94411e-315</p>
<p>XMM7 (floats)  := 0 0 0 0.00504971</p>
<p>TID0: INS 0x00401f51                     vsubss xmm5, xmm1, xmm0</p>
<p>TID0:      XMM5 := 00000000_00000000_00000000_43460000</p>
<p>XMM5 (doubles) := 0 5.57633e-315</p>
<p>XMM5 (floats)  := 0 0 0 198</p>
<p>TID0: INS 0x00401f55                     vmulss xmm5, xmm5, xmm7</p>
<p>TID0:      XMM5 := 00000000_00000000_00000000_3f7ff5a0</p>
<p>XMM5 (doubles) := 0 5.26353e-315</p>
<p>XMM5 (floats)  := 0 0 0 0.999842</p>
<p></code></p></blockquote>
<p>Здесь явно видно, что vmulss ( скалярное умножение с плавающей точкой ) в виде операндов получает</p>
<p>0.00504971 (XMM7) и 198 (XMM5). Результат остается в XMM5 (0.999842), что согласно моему калькулятору является истиной.</p>
<p>Структура debugtrace.out на самом деле довольно проста, и практически сразу, ну или со второго взгляда можно увидеть последние значения используемых регистров или памяти  J.</p>
<p>Для большего удобства советую также обратить внимание на dt_start_int3, который позволяет «окружать» интересный код для более детального разбора уже из SDE.</p>
<p>Я думаю проблем уже нет или ?</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2010/01/29/avx-debugging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance analysis tools for Linux</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/12/08/performance-analysis-tools-for-linux/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/12/08/performance-analysis-tools-for-linux/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 16:10:44 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Открытый код]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[linux kernel]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/12/08/performance-analysis-tools-for-linux/</guid>
		<description><![CDATA[Linux ядро и его нововведения. perf (Performance analysis tools for Linux)...]]></description>
			<content:encoded><![CDATA[<p>Новые ядра для линукса выходят довольно оперативно, но не всегда понятно - зачем,  почему именно сейчас, и для кого. Начав копаться в одном из (тогда) последних 2.6.31, я обнаружил довольно интересную вещь - perf (Performance analysis tools for Linux).</p>
<p>Вкусностей тут много, хотелось бы рассказать об одной из них. Итак, опция - stat или официально perf -stat - Run a command and gather performance counter statistics. Сразу скажу - надо перекомпилировать ядро, или найти уже готовый пакет, в котором будет папка tools/perf. Там же исходники perf,  о них мы и будем говорить.</p>
<p>Использование perf простое: - perf stat.<br />
Например:  perf stat top. После выполнения top, perf выдаст результаты, наример вот так :</p>
<blockquote><p><code><br />
Performance counter stats for 'top':<br />
      22.932115  task-clock-msecs         #      0.005 CPUs <br />              9  context-switches         #      0.000 M/sec<br />              0  CPU-migrations           #      0.000 M/sec<br />            354  page-faults              #      0.015 M/sec<br />       49301576  cycles                   #   2149.892 M/sec<br />       46533503  instructions             #      0.944 IPC  <br />        1418097  cache-references         #     61.839 M/sec<br />          35107  cache-misses             #      1.531 M/sec<br />    4.827942763  seconds time elapsed<br />
</code></p></blockquote>
<p>интерпретацией результатов можно заниматься долго, IMHO довольно интересно увидеть как часто менялся процессор - достаточно просто посмотреть на  CPU-migrations. Конечно, Perf  - нечто большее, чем этот маленький пример. </p>
<p>Дополнительную информацию можно найти тут /tools/perf/Documentation/examples.txt, или <a href="http://www.google.com/codesearch/p?hl=en#aWnupsccpa8/trunk/linux-2.6.31/tools/perf/Documentation/examples.txt&amp;q=/tools/perf/Documentation/examples.txt&amp;sa=N&amp;cd=1&amp;ct=rc">тут</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/12/08/performance-analysis-tools-for-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Накладные расходы в OpenMP, синхронизация и планировщик</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/08/10/openmp-2/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/08/10/openmp-2/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 14:49:23 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Открытый код]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/08/10/openmp-2/</guid>
		<description><![CDATA[OpenMP это конечно просто, но есть ли накладные расходы? В этой, заключительной части попробуем рассмотреть и оценить эти расходы в деталях на примере процессора Core i7 
]]></description>
			<content:encoded><![CDATA[<p>Как говорится, сказал А , говори и Б. Некоторое время назад я начал говорить о накладных расходах в OpenMP, что вызвало интерес читателей.</p>
<p>В частности по поводу ORDERED все явно можно увидеть прямо тут (графики кликабельны):</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/gen8s.pdf"><img class="alignnone size-full wp-image-2001876" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/gen8s1.png" alt="" width="500" height="338" /></a></p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/gen8c.pdf"><img class="alignnone size-full wp-image-2001876" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/gen8c.png" alt="" width="499" height="358" /></a></p>
<p>Cтандарное поведение:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/gen8n.pdf"><img class="alignnone size-full wp-image-2001876" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/gen8n.png" alt="" width="499" height="358" /></a></p>
<p>Пару слов от себя - вы, наверное, заметили характерные всплески расходов в compact версии при "заполнении" физического ядра?</p>
<p>Если посмотреть на поведение расходов при синхронизации, то получим следующие картинки:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/atom8s.pdf"><img class="alignnone size-full wp-image-2001876" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/atom8s.png" alt="" width="499" height="358" /></a></p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/atom8c.pdf"><img class="alignnone size-full wp-image-2001876" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/atom8c.png" alt="" width="499" height="358" /></a></p>
<p>Ну и стандартное поведение:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/atom8n.pdf"><img class="alignnone size-full wp-image-2001876" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/atom8n.png" alt="" width="499" height="358" /></a></p>
<p>Пару слов от себя: поведение ATOMIC довольно линейное по сравнению с другими вариантами.</p>
<p>И по планировщикам, о чем можно говорить еще больше и шире:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/sched8c.pdf"><img class="alignnone size-full wp-image-2001876" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/sched8c.png" alt="" width="499" height="358" /></a></p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/sched8s.pdf"><img class="alignnone size-full wp-image-2001876" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/sched8s.png" alt="" width="499" height="358" /></a></p>
<p>По умолчанию же:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/sched8n.pdf"><img class="alignnone size-full wp-image-2001876" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/sched8n.png" alt="" width="499" height="358" /></a></p>
<p>От себя: GUIDED и DYMANIC - "большое зло" при неправильном использовании.</p>
<p>Стоит сказать, что разное количество OpenMP потоков регулировалось с помощью переменной окружения KMP_AFFINITY.</p>
<p>А если включить verbose у OpenMP, то можно увидеть еще больше интересного, например как именно и куда возможно положить внутренний OpenMP поток:</p>
<p><strong>Compact:</strong></p>
<blockquote><p>OMP: Info #149: KMP_AFFINITY: Affinity capable, using global cpuid instr info<br />
OMP: Info #154: KMP_AFFINITY: Initial OS proc set respected: {0,1,2,3,4,5,6,7}<br />
OMP: Info #156: KMP_AFFINITY: 8 available OS procs<br />
OMP: Info #157: KMP_AFFINITY: Uniform topology<br />
OMP: Info #159: KMP_AFFINITY: 1 packages x 4 cores/pkg x 2 threads/core (4 total cores)<br />
<strong><br />
OMP: Info #160: KMP_AFFINITY: OS proc to physical thread map ([] =&gt; level not in map):<br />
OMP: Info #170: KMP_AFFINITY: OS proc 0 maps to package 0 core 0 thread 0<br />
OMP: Info #170: KMP_AFFINITY: OS proc 4 maps to package 0 core 0 thread 1<br />
OMP: Info #170: KMP_AFFINITY: OS proc 1 maps to package 0 core 1 thread 0<br />
OMP: Info #170: KMP_AFFINITY: OS proc 5 maps to package 0 core 1 thread 1<br />
OMP: Info #170: KMP_AFFINITY: OS proc 2 maps to package 0 core 2 thread 0<br />
OMP: Info #170: KMP_AFFINITY: OS proc 6 maps to package 0 core 2 thread 1<br />
OMP: Info #170: KMP_AFFINITY: OS proc 3 maps to package 0 core 3 thread 0<br />
OMP: Info #170: KMP_AFFINITY: OS proc 7 maps to package 0 core 3 thread 1<br />
</strong><br />
OMP: Info #144: KMP_AFFINITY: Threads may migrate across 1 innermost levels of machine<br />
<strong><br />
OMP: Info #147: KMP_AFFINITY: Internal thread 0 bound to OS proc set {0,4}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 1 bound to OS proc set {0,4}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 2 bound to OS proc set {1,5}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 3 bound to OS proc set {1,5}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 4 bound to OS proc set {2,6}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 5 bound to OS proc set {2,6}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 6 bound to OS proc set {3,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 7 bound to OS proc set {3,7}</strong></p></blockquote>
<p><strong>Scatter:</strong></p>
<blockquote><p>OMP: Info #149: KMP_AFFINITY: Affinity capable, using global cpuid instr info<br />
OMP: Info #154: KMP_AFFINITY: Initial OS proc set respected: {0,1,2,3,4,5,6,7}<br />
OMP: Info #156: KMP_AFFINITY: 8 available OS procs<br />
OMP: Info #157: KMP_AFFINITY: Uniform topology<br />
OMP: Info #159: KMP_AFFINITY: 1 packages x 4 cores/pkg x 2 threads/core (4 total cores)<br />
OMP: Info #160: KMP_AFFINITY: OS proc to physical thread map ([] =&gt; level not in map):<br />
OMP: Info #170: KMP_AFFINITY: OS proc 0 maps to package 0 core 0 thread 0<br />
OMP: Info #170: KMP_AFFINITY: OS proc 4 maps to package 0 core 0 thread 1<br />
OMP: Info #170: KMP_AFFINITY: OS proc 1 maps to package 0 core 1 thread 0<br />
OMP: Info #170: KMP_AFFINITY: OS proc 5 maps to package 0 core 1 thread 1<br />
OMP: Info #170: KMP_AFFINITY: OS proc 2 maps to package 0 core 2 thread 0<br />
OMP: Info #170: KMP_AFFINITY: OS proc 6 maps to package 0 core 2 thread 1<br />
OMP: Info #170: KMP_AFFINITY: OS proc 3 maps to package 0 core 3 thread 0<br />
OMP: Info #170: KMP_AFFINITY: OS proc 7 maps to package 0 core 3 thread 1<br />
OMP: Info #144: KMP_AFFINITY: Threads may migrate across 1 innermost levels of machine<br />
<strong><br />
OMP: Info #147: KMP_AFFINITY: Internal thread 0 bound to OS proc set {0,4}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 1 bound to OS proc set {1,5}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 2 bound to OS proc set {2,6}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 3 bound to OS proc set {3,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 4 bound to OS proc set {0,4}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 5 bound to OS proc set {1,5}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 6 bound to OS proc set {2,6}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 7 bound to OS proc set {3,7}<br />
</strong></p></blockquote>
<p>и <strong>Default:</strong></p>
<blockquote><p>OMP: Info #149: KMP_AFFINITY: Affinity capable, using global cpuid instr info<br />
OMP: Info #154: KMP_AFFINITY: Initial OS proc set respected: {0,1,2,3,4,5,6,7}<br />
OMP: Info #156: KMP_AFFINITY: 8 available OS procs<br />
OMP: Info #157: KMP_AFFINITY: Uniform topology<br />
OMP: Info #159: KMP_AFFINITY: 1 packages x 4 cores/pkg x 2 threads/core (4 total cores)<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 0 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 1 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 2 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 4 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 3 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 5 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 6 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 7 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #149: KMP_AFFINITY: Affinity capable, using global cpuid instr info<br />
OMP: Info #154: KMP_AFFINITY: Initial OS proc set respected: {0,1,2,3,4,5,6,7}<br />
OMP: Info #156: KMP_AFFINITY: 8 available OS procs<br />
OMP: Info #157: KMP_AFFINITY: Uniform topology<br />
OMP: Info #159: KMP_AFFINITY: 1 packages x 4 cores/pkg x 2 threads/core (4 total cores)<br />
<strong><br />
OMP: Info #147: KMP_AFFINITY: Internal thread 0 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 1 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 2 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 3 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 4 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 5 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 6 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
OMP: Info #147: KMP_AFFINITY: Internal thread 7 bound to OS proc set {0,1,2,3,4,5,6,7}<br />
</strong></p></blockquote>
<p>Теперь вполне возможно ответить и на те вопросы, которые еще не заданы и/или казались очевидными. Как говорится - лучше один раз увидеть, чем 100 раз поговорить. Теперь вы увидели...</p>
<p>За сим прощаюсь, комментарии и вопросы - always welcome <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/08/10/openmp-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Накладные расходы в OpenMP, копирование данных</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/07/23/openmp/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/07/23/openmp/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 08:40:45 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Открытый код]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[openmp]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/07/23/openmp/</guid>
		<description><![CDATA[OpenMP и его спецификация богата всякими clauses (не скажу как правильнее перевести на русский язык). В частности то, что касается копирования/использования данных в параллельном цикле, определяется следующими ключевыми словами: PRIVATE, FIRSTPRIVATE, COPYPRIVATE, COPYIN. Вообще спецификация OpenMP очень стоящий документ, особенно если есть необходимость в использовании самого OpenMP. Именно в спецификации можно найти много примеров и [...]]]></description>
			<content:encoded><![CDATA[<p>OpenMP и его спецификация богата всякими clauses (не скажу как правильнее перевести на русский язык). В частности то, что касается копирования/использования данных в параллельном цикле, определяется следующими ключевыми словами: PRIVATE, FIRSTPRIVATE, COPYPRIVATE, COPYIN. Вообще спецификация OpenMP очень стоящий документ, особенно если есть необходимость в использовании самого OpenMP. Именно в спецификации можно найти много примеров и определений всех и вся, включая разные языки как Fortran и С/С++. В общем, если вы еще не посещали или не знаете главный сайт OpenMP - это просто <a href="http://openmp.org/">openmp.org</a>, и еще не поздно сходить и посмотреть.</p>
<p>Помимо простоты использования метода простого деления данных для последующей параллельной обработки может быть интересно понять бесплатно ли это с точки зрения накладных расходов самого OpenMP. Тут можно копать много и долго, и лучше всего это делать не абстрактно, а на основании реальных примеров.</p>
<p>Один из последних моих примеров показал, что в одном из продуктов известной компании Х применение OpenMP как быстрого и довольно простого подхода позволило ускорить выполнение функций коррекции цвета практически на 30%. Причем так как использовалось две функции со своим независимым использованием OpenMP внутри, вынос OpenMP во внешний цикл с последующим объединением этих функций в одну большую был просчитан как нецелесообразный по затратам драгоценного времени разработчиков и не приносящий больших выгод (не более 3%).</p>
<p>Но давайте вспомним о PRIVATE, FIRSTPRIVATE, COPYPRIVATE, COPYIN.<br />
IMHO лучше один раз увидеть, чем много раз проговорить. Поэтому делюсь первой долей информации, которая показывает результаты одного из доступных epcc OpenMP microbenchmarking, запущенных на Core i7 :</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/array8nt8.pdf" ><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/array8nt8.png" alt=""/></a><br />
(8 логических процессоров)<br />
где время накладных расходов по Y, и размерность используемых переменных по оси X .</p>
<p>А теперь если мы ограничим OpenMP для использования только 1го логического процессора:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/array8nt1.pdf"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/array8nt1.png" alt="" /></a></p>
<p>OpenMP имеет возможность устанавливать affinity, то есть ограничивать созданные потоки на определенных логических процессорах, но в представленных данных применялась стандартная схема - использование всех логических процессоров (OS processor). Другие варианты - compact (для каждого след. потока пытаться использовать следующее по топологии процессора ядро), scatter (противоположность compact) </p>
<p>Как видно, PRIVATE практически не страдает от расходов при использовании большего количества потоков.<br />
Хотя по данным можно увидеть и больше интересной информации - главным будет следующее:<br />
- Совпадает ли это с тем, что представлялось в голове ранее<br />
- Возрастают ли накладные расходы линейно<br />
- Где тот барьер, где расходы более ощутимы<br />
- Если есть какой-то спец. вопрос - можно попробовать увидеть ответ в визуальной форме и сразу его показать остальным</p>
<p>Я набрал "уже" 36 различных срезов/чартов (Core i7, на Nehalem EP ситуация не менее интересная и более объемная - 62 среза/чарта), и если будет интересно - будем шагать и обсуждать вместе и дальше...</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/07/23/openmp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Параллельный кругозор</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/07/21/2001727/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/07/21/2001727/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 08:00:39 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (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/07/21/2001727/</guid>
		<description><![CDATA[Как ни странно но вопросы что использовать что бы "описать" параллельный алгоритм еще всплывают и будут всплывать некоторое время в разговорах и/или "глазах" разработчиков. OpenMP, Intel TBB, вещи от Microsoft , Opensource комьюнити и тд и тп уже появились давно и даже успели пережить несколько версии. Однако и это еще далеко не конец. Apple все [...]]]></description>
			<content:encoded><![CDATA[<p>Как ни странно но вопросы что использовать что бы "описать" параллельный алгоритм еще всплывают и будут всплывать некоторое время в разговорах и/или "глазах" разработчиков.<br />
OpenMP, Intel TBB, вещи от Microsoft , Opensource комьюнити и тд и тп уже появились давно и<br />
даже успели пережить несколько версии. Однако и это еще далеко не конец.</p>
<p>Apple все шире и шире рассказывает о своем виденье - встречайте: Grand Central Dispatch,<br />
одно из далеко немногих, но качественных улучшений в новейшей OS от Apple: Snow Leopard</p>
</p>
<p>В принципе и опять же - все как бы просто: Появляеться некое расширения языка ( языков если быть точным : C/C++, Objective-C ) именующее себя блоком (block) и описываеться например так:<br />
<code>x = ^{ printf("hello world\n"); }</code><br />
В дальнейшем эти блоки формируються для последующего запуска из очереди и по мере наличия ресурсов. Причем изначально говорится о довольно быстром создании подобных блоков и постановки их в очередь, то есть об очень маленьком overhead при работе.<br />
Есть реальные примеры где подобные блоки используються вместо например критических секций в "банковском коде" <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br /> Это конечно довольно критическое расширение языка, однако работает.<br />
Несколько печально что многое по этой теме еще под некоторым NDA а то можно было бы показать Вам и больше.</p>
<p>Я думаю что этот немного короткий но информативный пост позволит немного лучше очертить горизонты, а больше - насколько я помню в Сентябре Snow Leopard is out и обо всем можно будет говорить больше и полнее, с деталями.</p>
<p> Хинт: википедия уже знает кое что об Grand Central Dispatch. </p>
<p>PS Сравнение с TBB уже делалось, результаты есть и довольно интересные, но опять пока несколько рано говорить о них публично, прощу меня извенить что не озвучу.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/07/21/2001727/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intel® Architecture Code Analyzer for Intel® AVX Instruction Set</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/04/14/intel-architecture-code-analyzer-for-intel-avx-instruction-set/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/04/14/intel-architecture-code-analyzer-for-intel-avx-instruction-set/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 09:47:50 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Открытый код]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[avx whatif tools]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/04/14/intel-architecture-code-analyzer-for-intel-avx-instruction-set/</guid>
		<description><![CDATA[Мы движемся и движемся вперед. Как известно, в новых процессорах, набор SSE инструкции не планируеться расширять, улучшать и так далее, хотя само направление живое и переродиться под несколько другим именем - Advanced Vector Extensions или в сокращении - AVX. Одно из главных и принципиальных изменений это изменения базовых типов, с которыми работают инструкции, а вернее их [...]]]></description>
			<content:encoded><![CDATA[<p>Мы движемся и движемся вперед. Как известно, в новых процессорах, набор SSE инструкции не планируеться расширять, улучшать и так далее, хотя само направление живое и переродиться под несколько другим именем - Advanced Vector Extensions или в сокращении - AVX.</p>
<p>Одно из главных и принципиальных изменений это изменения базовых типов, с которыми работают инструкции, а вернее их расширения до 256 бит вместо 128 т.е в два раза.</p>
<p>Другими словами - с SSE одновременно можно проводить операции с четырьмя переменными типа float, а с AVX - c восемью.</p>
<p>Уже доступны компиляторы, эмуляторы, но не само железо, харт - его стоит ожидать познее в следующем году или типа того <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>Как, я думаю, все уже слышали о whatif.intel.com - сайт который хостит многие открытые разработки/наработки и "как бы" продукты.</p>
<p>Почему "как бы" - в силу того что это процесс исследования необъятной предметной области, исследования ведеться и в открытом режиме, где Ваши комментарии очень даже приветствуються!</p>
<p>Так вот - 1 Апреля (причем не шутка как проект так и его анонс) вышел в свет так называемый Intel® Architecture Code Analyzer for AVX Instruction set (IACA)</p>
<p>Который стараеться на основе использования AVX инструкций показать общую картину использования Портов процессора, вместе с вопросами тайминга как Latency/Throughput.</p>
<p>Cтоит немного объяснить что подразумеваеться под понятием "порты процессора":</p>
<p>- Внутри процессора есть различные модули, которые являються элементами общего конвейэра (pipeline) обработки инструкций.</p>
<p>- Один из таких модулей - Execution Core (исполнительный модуль как следует из названия ) содержит в себе дальнейшее разделение на так называемые Порты и Исполнительные Юниты (Execution Units)</p>
<p>Вот именно эти самые Порты (пронумерованы от 0 до 5 ) и являються воротам к исполнению команд в последующих Execution Unit(s). Здесь стоит сказать что они (Execution Unit) не универсальны сами по себе и могут выполнять только предопределенного типа работу.</p>
<p>Так, например операции над типом Integer в SSE инструкциях подготавливаться для дальнейшего исполнения</p>
<p>ТОЛЬКО внутри Порта 0 или 5 , а вот неSIMD Integer  - могут на 0,1,5 . Сохранение данные - только Порт 4 , а вот чтение - только Порт 2.</p>
<p>Как видно - довольно много зависимостей и ограничений , которые между прочим еще и варьируються от одного поколение процессоров к другому.</p>
<p>(Достаточно обширно данная тема описана в Intel Manuals и в частности Intel® 64 and IA-32 Architectures Optimization Reference Manual)</p>
<p> </p>
<p>В силу того что инструкции следуют последовательно, то вполне вероятно что некоторые последовательности будут загружать определенные Порты, возможно даже не оптимально, тем самым замедлять всю имплементацию алгоритма</p>
<p>(я намеренно опускаю здесь вариант Out-Of-Order исполнения )</p>
<p>Теперь должна быть понятна цель IACA - показать и  попытаеться оценить все эти зависимости, если они есть.</p>
<p>Само по себе использование IACA довольно простое, например так:</p>
<div><strong></strong></div>
<p><code> #include "iacaMarks.h"<br />
 ...<br />
 for (j=0; j&lt;N; j++){<br />
IACA_START<br />
     a[j] = b[j]+scalar*c[j];<br />
IACA_END<br />
   }<br />
</code></p>
<p align="left"><a href="http://software.intel.com/en-us/articles/intel-architecture-code-analyzer/"></a></p>
<p align="left">Oчень советую посмотреть IACA User Guide и в частности Раздел 5 - Analysis and Optimization Example для примеров возможной оптимизации.<br />
ну и на последок, главная ссылка - <a href="http://software.intel.com/en-us/articles/intel-architecture-code-analyzer/">http://software.intel.com/en-us/articles/intel-architecture-code-analyzer/</a></p>
<p align="left">PS Где взять AVX компилятор и эмулятор ? - читайте Frequently Asked Questions по линку выше...</p>
<p align="left"> </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/04/14/intel-architecture-code-analyzer-for-intel-avx-instruction-set/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Перечитай, пересмотри и убедись что вышел за край...</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/03/18/2000798/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/03/18/2000798/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 12:00:09 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Графика]]></category>
		<category><![CDATA[Открытый код]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[dcc]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[render]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/03/18/2000798/</guid>
		<description><![CDATA[  Как всегда - хочется посмотреть на что то интересное, а главное новое. Взял я тут "практически" навскидку один open source проект и думаю дай займусь, может чего и выйдет Кстати, для тех что не совсем в курсе - Pixie (www.renderpixie.com), проект который я взял, это RenderMan-like photorealistic renderer. RenderMan же - это продукт, я думаю [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/optimization_2_full.jpg"></a> </p>
<p>Как всегда - хочется посмотреть на что то интересное, а главное новое.</p>
<p>Взял я тут "практически" навскидку один open source проект и думаю дай займусь, может чего и выйдет <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Кстати, для тех что не совсем в курсе - Pixie (<span style="#008000;">www.<strong>renderpixie</strong>.com</span>), проект который я взял, это RenderMan-like photorealistic renderer.</p>
<p>RenderMan же - это продукт, я думаю многим известной, компании Pixar, ну той, что много мультиков/фильмов "разукрашивает".</p>
<p>Вот кстати большой список фильмов с активным участием уважаемой компании Pixar - <a href="https://renderman.pixar.com/products/whatsrenderman/movies.html">https://renderman.pixar.com/products/whatsrenderman/movies.html</a></p>
<p>Ну вообщем "дело было вечером, делать было нечего" (с) чей то.</p>
<p>Благо Pixie собрался из исходников быстро (на Linux, на Windows немного не так <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) и PTU был настроен ранее.</p>
<p>PTU это Intel® Performance Tuning Utility доступный на whatif.intel.com или более прямая ссылка - http://software.intel.com/en-us/articles/intel-performance-tuning-utility/ </p>
<p>Принципы работы этого рендера мне известны, кстати очень советую проштудировать эту тему даже, это не realtime конечно, но основы были заложены еще до этого и с успехом живут до сих пор.</p>
<p>вообщем на одной из тестовых сцен получилась довольно интересная картинка:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/optimization_1.jpg"><img class="alignnone size-full wp-image-2000797" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/optimization_1.jpg" alt="" width="500" height="245" /></a></p>
<p>те порядка 37% общего времени мы крутимся в одной из функций - lookupPixel и общее время работы :</p>
<blockquote><p>time /opt/pixie/bin/rndr -t:4 ./Beauty_Pass1.rib</p>
<p>real 0m50.973s</p></blockquote>
<p>Кстати по умолчанию рендер будет использовать 2 треда для вычислений, но у меня 4 ядра запаковано в процессор - поэтому я говорю использовать их все с помощью флага -t:4</p>
<p>Казалось бы ну вот тут мы сразу и в недостатки/нехватку кэша и попадаем. Вот тут и надо вспомнить на чем теория строиться</p>
<p>REYES ( <em>Renders Everything You Ever Saw</em>  ) алгоритм изначально пытаеться ограничить себя по использованию памяти. Молодцы автора что так думали, да и не было у них в те, далекие от сегодня, времена достаточно компьютерной памяти для даже одного фрейма, а хотелось то фильм делать.</p>
<p>ВООБЩЕМ , стоит посмотреть поглубже ибо "авось" тоже забывать не стоит.</p>
<p>Углубимся дальше в код с помощью PTU и видим:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/access_overall.jpg"><img class="alignnone size-full wp-image-2000802" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/access_overall.jpg" alt="" width="500" height="300" /></a></p>
<p>те использование access (причем довольно интересным способом , с помощью define ) примерно и составляет изначальную картину в 85,967 самплов.</p>
<p>Однако дебагговой информации явно не хватает что бы раскрыть access до уровня строк и поэтому стоит смотреть дальше, возможно сопоставлять ассемблерный код с С строками.</p>
<p>ну что же - посмотрим и сюда:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/big_1.jpg"><img class="alignnone size-full wp-image-2000804" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/big_1.jpg" alt="" width="500" height="344" /></a></p>
<p>где видно что что то забавное происходит возле add eax,01h , границы которой с успехом "потребляют" 21263 из 30337 сэмплов по CPU_CLK_UNHALTED.CORE , причем только в одном вызове access. Cтрока 799 слева от инструкции (Line) ссылается на access(x,y) .</p>
<p> (извиняюсь заранее что все и на одной картинке тяжело показать - приходиться чем то жертвовать и просто больше описывать если есть вопросы)</p>
<p>Вот тут и надо прикинуть каком С коду эта ассемблерная инструкция может соответсвовать <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  это как бы уже просто:</p>
<blockquote><p> 790                         CRenderer::textureRefNumber[thread]++;                                              \<br />
 791                         block-&gt;threadData[thread].lastRefNumber =   CRenderer::textureRefNumber[thread];    \</p></blockquote>
<p>где CRenderer::textureRefNumber это просто глобальный массив типа int, те 4 байта каждый элемент.</p>
<p>И если посмотреть на общую картину - становиться понятным: каждый тред берет из пула блок, увеличивает Reference counter на единицу в одном и глобальном массиве.</p>
<p>Я думаю что после моих предыдущих постов и многих других людей - я могу даже не называть имя такой проблемы <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>Я не был уверен стоит или нет писать еще одну запись насчет этой проблемы , но если ранее это были - "подопытные кролики", то сейчас это реальный код существующего приложение.</p>
<p>забегаю вперед скажу что если решить проблему то вполне можно получить следующее улучшение:</p>
<blockquote><p>time /opt/pixie/bin/rndr -t:4 ./Beauty_Pass1.rib</p>
<p>real    0m35.685s</p></blockquote>
<p>и следующие претенденты на препарирование всплывают практически сразу.</p>
<p> <a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/optimization_2_full.jpg"><img class="alignnone size-full wp-image-2000806" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/optimization_2_full.jpg" alt="" width="500" height="240" /></a></p>
<p>те примерно 1.38х улучшение по времени.</p>
<p>(Кстати обратите внимание что loopupPixel (RVA 0x38A280) все еще не хочет покидать границы нашего чарта!)</p>
<p>Если хочется код решение - он скоро должен появиться в проекте Pixie, open source.</p>
<p>У меня на данные момент как минимум два решения готово, но буду следовать coding guidelines проекта.</p>
<p>Кстати одно из решений имело проблему</p>
<blockquote><p>error: alignment of array elements is greater than element</p></blockquote>
<p>причем специфичную для gcc , где как вариант что то типа</p>
<p>#define CACHE_LINE  64</p>
<p>#ifdef _WINDOWS<br />
#define CACHE_ALIGN __declspec(align(CACHE_LINE))<br />
#else<br />
#define CACHE_ALIGN __attribute__ ((aligned(CACHE_LINE)))<br />
#endif</p>
<p>typedef CACHE_ALIGN struct{<br />
    int value;<br />
    char alignment [CACHE_LINE-sizeof(int)];<br />
} array_int_aligned;</p>
<p>может быть использовано.</p>
<p>(кстати выравнивание для каждого элементов в массиве , а не только начала массива , не должно быть проблемой у любого разработчика)</p>
<p>Eсли будет интересно - в следующих постах я постараюсь сосредоточиться на других проблемах в поисках абсолютной производительности и масштабируемости, таких как:</p>
<p>- использование векторизации</p>
<p>в gcc по умолчанию для O3 , хотя в gcc 4.3.0 разница между O2 и O3 только</p>
<blockquote><p>&gt;   -fgcse-after-reload                 [enabled]<br />
&gt;   -finline-functions                  [enabled]<br />
&gt;   -fpredictive-commoning              [enabled]<br />
&gt;   -ftree-vectorize                    [enabled]<br />
&gt;   -funswitch-loops                    [enabled]</p></blockquote>
<p>- использование double как явное и неявное приведение типом / ассемблерный код и производительность</p>
<p>- Thread Profiler in action</p>
<p> - изменения в алгоритме</p>
<p> </p>
<p>Вообщем этот пост уже и так длинный, stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/03/18/2000798/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

