<?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"
	>

<channel>
	<title>Блоги Intel® Software Network &#187; Открытый код</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/category/open-source/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/ru-ru/blogs</link>
	<description></description>
	<pubDate>Sun, 22 Nov 2009 20:40:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>en</language>
			<item>
		<title>Go, Go, Google, Go!</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/11/12/go-go-google-go/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/11/12/go-go-google-go/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 08:31:28 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
		
		<category><![CDATA[Открытый код]]></category>

		<category><![CDATA[Параллельное программирование]]></category>

		<category><![CDATA[Google Go]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/11/12/go-go-google-go/</guid>
		<description><![CDATA[Я начал подозревать неладное, когда появился онлайновый почтовый клиент и сервер одновременно Gmail. Подозрения усилились с запуском онлайновых офиса и переводчика. После анонса "андроида" не спал всю ночь, думал о виртуальном Big Brother'е. Браузер Chrome поставил на компьютер в первый же день, потому что все уже было понятно. Выход Google Wave воспринял, как грубые ласки перед массовой виртуальной лоботомией...]]></description>
			<content:encoded><![CDATA[<p>Ну что, свершилось... Я начал подозревать неладное, когда появился онлайновый почтовый клиент и сервер одновременно Gmail. Подозрения усилились с запуском онлайновых офиса и переводчика. После анонса "андроида" не спал всю ночь, думал о виртуальном Big Brother'е. Браузер Chrome поставил на компьютер в первый же день, потому что все уже было понятно. Выход Google Wave воспринял, как грубые ласки перед массовой виртуальной лоботомией...</p>
<p>И вот - гран финале. Сегодня Google объявила о выходе собственного языка программирования Go. Начался обратный отсчет времени до тотального покорения галактики.</p>
<p>Я сейчас сижу на сайте <a href="http://golang.org/">http://golang.org/</a>, читаю документацию и паралелльно общаюсь со знатоками. Не скрою, мне трудно, потому что никакой я не программист  - так, тестировщик. Пока на вид ничего страшного: в FAQ много уклончивых формулировок и маркетингового бла-бла, и по соседству признается, что даже в самой великой и ужасной Google до массового использования мегаязыка пока не дошло.</p>
<p>И вот вроде всего первый день пошел, а отзывов в Интернете уже пруд пруди. Кто-то называет странным плодом любви Python с C++. Кто-то придумал имя для людей, программирующих на нем - Goпники. Есть голоса, предрекающие кончину во младенчестве, а есть и оптимисты, гарантирующие скорый переход на Go 99,9 процентов всех программистов мира. Не 100, потому что этих фортранщиков все равно не переубедить. Они переживут даже ядерную зиму.</p>
<p>Скептики могут сказать, что существует несколько тысяч языков программирования, и одним больше, одним меньше - не повод тратить виртуальные чернила. Но тут ведь как в известном анекдоте: "я не знаю, кто в машине, но шофер у него Брежнев". Людские и финансовые возможности Google таковы, что если в компании решат - Go попрет стремительным домкратом. Коллеги по бизнесу сначала посмеются, потом помолчат, а потом запрутся в маленьких комнатках и начнут бояться любого звука. Помните, как хихикали над Microsoft, когда корпорация вышла на рынок приставок? Вот, недавно вышло исследование - на долю Xbox приходится уже 49% отечественного рынка, да и на мировом одни сплошные поводы для оптимизма. В общем, главное - захотеть.</p>
<p>Но захочет ли Google? Чтобы понять это, язык  <span style="line-through;">врага</span> надо знать и понимать немного лучше, чем это под силу экс-тестировщику. Поэтому обращаюсь к вам, уважаемые коллеги. Каковы первые впечатления? Насколько доработан язык на сегодняшний день? Правда ли, что он заточен исключительно под серверные приложения, а остальным просьба не беспокоится? Что может заставить лично вас серьезно сесть на Go? И - главное - нужен ли индустрии новый язык программирования? И нужен ли ей Go?</p>
<p>Меня пока порадовало вот что. В беседе с одним из экспертов, автором нескольких серьезных книг по программированию, который пока решил остаться неизвестным, первым делом был озвучен интерес -насколько применение Go облегчает распараллеливание?</p>
<p>Дорогой Дмитрий Оганезов! Даже если Big Brother нас таки заглотит, мы будем знать, что идея пошла в массы, и если бы не он - все бы у нас получилось. Но может еще и получится, а?</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/11/12/go-go-google-go/feed/</wfw:commentRss>
		</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>
		</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>
		</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>
		</item>
		<item>
		<title>Недолгая бесплатная радость</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/04/03/2000927/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/04/03/2000927/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 14:08:58 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
		
		<category><![CDATA[Открытый код]]></category>

		<category><![CDATA[Параллельное программирование]]></category>

		<category><![CDATA[Разработка софта]]></category>

		<category><![CDATA[iPhone]]></category>

		<category><![CDATA[Nehalem]]></category>

		<category><![CDATA[PSP]]></category>

		<category><![CDATA[свобода]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/04/03/2000927/</guid>
		<description><![CDATA[Как помнят некоторые читатели моего блога, при наличии телевизора, нескольких ноутбуков и большого мощного компьютера с 20-дюймовым экраном, я предпочитаю смотреть кино на Sony PSP. Мой контракт на PR компании Sony истек первого апреля, так что на этот раз не буду рассказывать о чудесных достоинствах этой портативной игровой консоли. Она действительно замечательная - и точка.
Есть три [...]]]></description>
			<content:encoded><![CDATA[<p>Как помнят некоторые читатели моего блога, при наличии телевизора, нескольких ноутбуков и большого мощного компьютера с 20-дюймовым экраном, я предпочитаю смотреть кино на Sony PSP. Мой контракт на PR компании Sony истек первого апреля, так что на этот раз не буду рассказывать о чудесных достоинствах этой портативной игровой консоли. Она действительно замечательная - и точка.</p>
<p>Есть три способа добыть видео для просмотра на PSP. Первый - и теоретически самый простой - купить диск UMD-Video. Но в России их продают крайне вяло (настолько, что они мне в наших краях ни разу на прилавке не встретились), и русскоязычными звуковыми дорожками там не пахнет. Второй - добыть уже готовое видео в торрентах, но мы парни честные, пиратством не балуемся, да к тому же кино там лежит все больше англоязычное, без локализации. Третий способ - наш! - это купить лицензионный DVD и перегнать его в формат, признаваемый Sony PSP. Я перепробовал немало соответствующих утилит, но остановился на XviD4PSP, которую делает наш парень. Имени его не знаю, но ему нравится называть себя Винни.</p>
<p>Так вот всем хороша программа, но она... бесплатная. Казалось бы, чего тут возмущаться? Это же хорошо, когда денег не просят! Так-то оно так, но в октябре прошлого года Винни увлекся созданием другой утилиты, Winnydows Commander, а XviD4PSP обновлять перестал. Что случилось в октябре читатели этого блога знать должны. Нет, серьезно должны. ДОЛЖНЫ. Что, правда не помните? Гм. Гм. Ладно, оставим кокетство. В октябре появились компьютеры на самой прогрессивной и быстрой платформе в мире - Intel Nehalem. Зело возрадовался я этому факту, кинулся жать видел на термоядерной скорости, и вдруг получил на выходе нечто страшное и для просмотра непригодное. Сунулся разбираться, и обнаружил, что последняя версия XviD4PSP с Nehalem попросту не работает. Пришлось откатываться назад, на позапрошлую инкарнацию, но она и жмет не так качественно, и файлы получаются немного длиннее... В общем, насладиться прелестями Nehalem'а в полном объеме у меня не получается до сих пор, и от печали великой жму видео на самосборном NAS'е, руладами о котором я тут надоел почище, чем PSP.</p>
<p>И что прикажете делать? Написать доброму парню Винни - дорабатывай, лентяй, свое детище под Nehalem? Так он мое письмо просто проигнорирует, прикинув, что ради какого-то техноманьяка добывать Core i7 и докапываться, в чем там косяк, дорого и бессмысленно. Это не умозрительное предположение - я ему писал <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Будь это продукт коммерческий, шансов докричаться имелось бы побольше - мол, кровные уплочены, давайте пошевеливайтесь. С нашими парнями, правда, это тоже не очень работает (вспомним чудесный почтовый клиент The Bat!, до сих пор думающий, что процессоры бывают только одноядерными), но хоть кричать можно с чистой совестью.</p>
<p>В связи с этим у меня возник странный вопрос. Есть такое понятие - свободный софт. То есть собираются умные добрые парни, пишут гениальные программы (и даже целые операционные системы), а потом отдают свои шедевры всем желающим задаром. Разве что с указанием кошелька вебманей, куда при некотором желании можно перевести пару долларов. Допустим, я на это предложение с радостью отозвался, убедился, что здесь и сейчас все работает просто изумительно, и сделал на бесплатную программу серьезную ставку. Например, возвел в ранг семейной традиции субботний просмотр новой серии мультфильма "Робоцып" на PSP. Или сделал из компьютера музыкальную студию, использующую исключительно свободный софт.</p>
<p>Все работает, все счастливы, и вдруг в компьютере появляется новая железка. Или рождается новый и очень удачный музыкальный формат. Мы идем на сайт к добрым парням, и обнаруживаем, что они уже давно забросили мирские дела и ушли жить в монастырь кармелиток, что в Хайфе. Семейная традиция рушится (хорошо, если одна, без семьи), звукооператор уходит в глубокий запой после недели безуспешных попыток разобраться в новых софтинах для студии, а вы чешете затылок и думаете - зачем была нужна такая вот свобода?</p>
<p>В связи со всем вышесказанным у меня вопрос. Можно ли в долгосрочной перспективе доверять свободному-свободному софту? Не просто свободному, которые делают серьезные компании, расчитывая со временем компенсировать затраты на разработку с консультаций и эксклюзивных патчей. А именно свободному-свободному, создаваемому энтузиастами-одиночками? Есть ли примеры серьезных и постоянно необходимых программ, развиваемых абсолютно безвозмездно, скажем, лет десять? Мне в голову приходит разве что RivaTuner, да и да, пожалуй, не относится к числу жизненно-необходимых... Да, и еще, если можно, давайте не будем развивать тему "там же код обычно открытый, можно самому докрутить, если что". Программисту это действительно не очень сложно. Но не все (к сожалению?) ими становятся.</p>
<p>Я же хочу на выходных попробовать пожать видео для iPhone. Некоторые ценители говорят, что на нем смотрится даже приятнее, чем на PSP. Ох уж эти макоманьяки... <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/04/03/2000927/feed/</wfw:commentRss>
		</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>
		</item>
		<item>
		<title>Вкус векторизации</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/02/16/2000642/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/02/16/2000642/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 13:21:44 +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[optimization]]></category>

		<category><![CDATA[SSE]]></category>

		<category><![CDATA[vectorization]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/02/16/2000642/</guid>
		<description><![CDATA[В трудовые будни наобщавшись с народом я понял что что то с темой векторизации (Vectorization по-английски)  еще не всем понятно.
Много всего, может быть, уже написанно однако - постараемся суммировать знания.
Как известно в C/C++ мы оперируем с операндами, которые обязаны иметь тип, что внутренне подразумевает размерность или количество байт необходимых для хранения самих операндов/переменных.
Sizeof() как раз и [...]]]></description>
			<content:encoded><![CDATA[<p>В трудовые будни наобщавшись с народом я понял что что то с темой векторизации (<span style="Times New Roman;">Vectorization по-английски</span>)  еще не всем понятно.</p>
<p>Много всего, может быть, уже написанно однако - постараемся суммировать знания.</p>
<p>Как известно в C/C++ мы оперируем с операндами, которые обязаны иметь тип, что внутренне подразумевает размерность или количество байт необходимых для хранения самих операндов/переменных.</p>
<p>Sizeof() как раз и существует для определения размерности типа/переменной, в итоге (опущу разные размерности на разных архитектурах) имеет что то типа</p>
<blockquote><p><span class="kw4"><span class="search_hit">sizeof</span></span><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy0">:</span> <span class="nu0">4</span><br />
<span class="kw4"><span class="search_hit">sizeof</span></span><span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span><span class="sy0">:</span> <span class="nu0">4</span><br />
<span class="kw4"><span class="search_hit">sizeof</span></span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="sy0">:</span> <span class="nu0">8</span><br />
<span class="kw4"><span class="search_hit">sizeof</span></span><span class="br0">(</span><span class="kw4">char</span><span class="br0">)</span><span class="sy0">:</span> <span class="nu0">1</span></p></blockquote>
<p>Регистры процессора тоже - 16bit (2 байта) - как AX, BX, CX, DX и тд,</p>
<p>32 - EAX, EBX, ECX, EDX и тд,</p>
<p>64 - RAX, RBX, RCX, RDX и тд,</p>
<p>Все хорошо, если бы только это.</p>
<p>Набор команд SSE (Streaming SIMD Extensions) вносит новый тип размерности, определеный самим железом - 128 бит (16 байт) - XMM0 - XMM7 (8-15)</p>
<p>Естественно было бы предположить что было бы хорошо "вложить" наши переменные как можно "поплотнее" в XMM регистры и дальше делать вычисления, это должно быть как минимум быстрее.</p>
<p>Вот это и называеться векторизацией. SSE появился в Pentium III линейки Intel что говорит что те или иные версии SSE уже в большинстве используемых компьютеров.</p>
<p>Приятно отметить что компиляторы C/C++ (GCC, Intel Compiler) понимают необходимость векторизации и вполне могут помочь в ее использовании.</p>
<p>Как и все прелести жизни - иногда нам не надо ничего делать и все уже работает , иногда же приходиться что то менять (например код программы).</p>
<p>Как очень неплохое начало для GCC - рекомендую посмотреть на опцию <code><span style="EN" lang="EN">-ftree-vectorize</span></code>  и дальше много интерестного о текущем положении дел и истории например вот тут </p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="RU" lang="RU"><a href="http://gcc.gnu.org/projects/tree-ssa/vectorization.html"><span style="Times New Roman;">http://gcc.gnu.org/projects/tree-ssa/vectorization.html</span></a></span></p>
<p>Intel Compiler содержит очень достойную инфу в helpах, где разбираеться большое количество примером автоматической векторизации а так же "помощи" компилятору.</p>
<p>Например можно использовать ключевые слова <span style="AR-SA;">restrict или же #pragma ivdep.</span></p>
<p><span style="AR-SA;">Существует несколько проблем, которые мешают автоматической векторизации и компилятор, не владеющей всей информацией об алгоритме и его вариантах использования будет идти по безопасному но не всегда оптимальному тупи.</span></p>
<p><span style="AR-SA;">например ivdep говорит мол - игнорирую те зависимости что ты (компилятор) себе вычислил/придумал.</span></p>
<p> <span style="AR-SA;">Немного о зависимостях между данными и итерациями в циклах: в основном выделяют</span></p>
<p><span style="EN-US;">FLOW (READ after WRITE), OUTPUT (WRITE after WRITE) or ANTI (WRITE after READ) - думаю много понятно уже из кратких аннотаций.</span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="EN-US;">Например FLOW</span></p>
<blockquote><p> <span style="EN-US;"><span>  for (int j=1; j&lt;1024; j++)</span> </span></p>
<p class="Preformatted"><span>    A[j]=A[j-1];</span></p>
</blockquote>
<p>если использовать /Qvec-report:3 для Intel Compiler или <span style="Courier New;">-ftree-vectorizer-verbose=5 для GCC можно узнать в деталях об успехах или неудачах автоматической векторизации </span> </p>
<p class="Preformatted">например так</p>
<blockquote><p>Intel Compiler:</p>
<p>sample.cpp(11) : (col. 6) remark: loop was not vectorized: not inner loop.<br />
sample.cpp(12) : (col. 5) remark: vector dependence: assumed FLOW dependence between c line 13 and b line 13.</p>
<p>GCC:<br />
vect-1.c:94: note: not vectorized: possible dependence between data-refs a[i_283] and a[i_48]</p></blockquote>
<p> </p>
<p><span style="AR-SA" lang="EN-US">В срезе векторизации надо отметить что существует для типа SSE инструкций - Scalar (одно действие над даннами) и Packed (несколько действий на разными данными ) например умножение - MUL или в срезе SSE: MULPS (Multiply <strong>packed</strong> single precision), MULSS  (Multiply <strong>scalar</strong> single precision). Т.е. например MULPS делает умножение над 4-мя (128 бит / (32 бита на элемент) ) операндами сразу. Что интерестно - время исполнения MULPS vs MULSS  одинаковое для последних процессоров = 1 такт. Информацию о тактах легко найти например в Intel 64 and IA-32 Architectures Optimization Reference Manual.</span></p>
<p><span style="AR-SA" lang="EN-US">AVX - следующих шаг, после SSE, вводит в обиход вообще новый тип данных шириной 256 бит , те в два раза шире чем у SSE. Кстати много достойной информации, включая технические детали, компилятор и эмулятор доступно на </span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="RU" lang="RU"><a href="http://software.intel.com/sites/avx/"><span style="Times New Roman;">http://software.intel.com/sites/avx/</span></a> </span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"> <span style="RU" lang="RU">Теперь вы и сами можете оценить оптимизацию доступную простым использованием векторизации.</span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"> <span style="RU" lang="RU">Кстати - рекомендую так же посмотреть на свободно распространяемые помощник по SSE/AVX инструкциям и интриксисам - <strong>Intel Intrinsic Guide</strong> (на странице <span style="RU" lang="RU"><a href="http://software.intel.com/sites/avx/"><span style="Times New Roman;">http://software.intel.com/sites/avx/</span></a> </span>)</span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="RU" lang="RU"><strong></strong></span> </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/02/16/2000642/feed/</wfw:commentRss>
		</item>
		<item>
		<title>На три буквы</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/02/05/2000620/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/02/05/2000620/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 20:14:19 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
		
		<category><![CDATA[Мобильность]]></category>

		<category><![CDATA[Открытый код]]></category>

		<category><![CDATA[Разработка софта]]></category>

		<category><![CDATA[ICQ]]></category>

		<category><![CDATA[Intel]]></category>

		<category><![CDATA[лентяи]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/02/05/2000620/</guid>
		<description><![CDATA[Последние две недели проходят под знаком постоянного обновления протокола ICQ, приводящего к отключению от сети т.н. альтернативных клиентов. На самом деле, их правильнее называть "безальтернативными", потому что аутентичные "аськи" насколько примитивны, настолько и неудобны. Даже голенькая Miranda на раз забарывает ICQ 6.5, а что говорить про монстров, вроде QIP? И ведь, что характерно, над ICQ [...]]]></description>
			<content:encoded><![CDATA[<p>Последние две недели проходят под знаком постоянного обновления протокола ICQ, приводящего к отключению от сети т.н. альтернативных клиентов. На самом деле, их правильнее называть "безальтернативными", потому что аутентичные "аськи" насколько примитивны, настолько и неудобны. Даже голенькая Miranda на раз забарывает ICQ 6.5, а что говорить про монстров, вроде QIP? И ведь, что характерно, над ICQ работает гигант AOL с бригадой высокооплачиваемых программистов, тогда как QIP делает 2 (два) человека, и чуть ли не за <span style="line-through;">еду</span> "спасибо".</p>
<p>Разумеется, я далек от осуждения действий AOL - если компании угодно угробить купленный за бешеные бабки проект, она имеет на то полное право. Просто мы, когда писали статью для "Компьютерры", так и не смогли найти примеров откровенного слива рынка хозяином популярной технологии. Например, вы представляете, чтобы файлы формата .psd альтернативный редактор обрабатывал лучше Photoshop? Или чтобы по "родному" Skype приличные люди говорили только под угрозой нанесения ущерба физиономии?</p>
<p>Если у вас в коллекции есть такие "альтернативные" примеры - поделитесь, пожалуйста. Судя по всему, к теме "аськи" нам, IT-журналистам, в ближайшие месяцы придется обращаться еще не раз и не два.</p>
<p>А пока с удовольствием рапортую о публикации на портале "Компьютерра-Онлайн" статьи о моем путешествии в Израиль и визите в центр разработок Intel, расположенный в городе Хайфа. Мне редко нравятся свои статьи, но эта реально удалась. <a href="http://www.computerra.ru/interactive/399608/">Только попробуйте не согласиться <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/02/05/2000620/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenMP, Linux и немного фана</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/01/13/openmp-linux/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/01/13/openmp-linux/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 12:48:44 +0000</pubDate>
		<dc:creator>Maxym Dmytrychenko (Intel)</dc:creator>
		
		<category><![CDATA[Открытый код]]></category>

		<category><![CDATA[Параллельное программирование]]></category>

		<category><![CDATA[Разработка софта]]></category>

		<category><![CDATA[compiler]]></category>

		<category><![CDATA[gcc]]></category>

		<category><![CDATA[icc]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[openmp]]></category>

		<category><![CDATA[thread checked]]></category>

		<category><![CDATA[thread profile]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/01/13/openmp-linux/</guid>
		<description><![CDATA[Попался вот такой кусок кода для вычисления тривиального числа Pi
n = 1000000000
62    h   = 1.0 / (double) n;
63    sum = 0.0;
64
65    for (i = 1; i &#60;= n; i++)
66    {
67           x = h * ((double)i - 0.5);
68           sum +=(4.0 / (1.0 + x*x));
69  [...]]]></description>
			<content:encoded><![CDATA[<p>Попался вот такой кусок кода для вычисления тривиального числа Pi</p>
<p>n = 1000000000<br />
62    h   = 1.0 / (double) n;<br />
63    sum = 0.0;<br />
64<br />
65    for (i = 1; i &lt;= n; i++)<br />
66    {<br />
67           x = h * ((double)i - 0.5);<br />
68           sum +=(4.0 / (1.0 + x*x));<br />
69    }<br />
70<br />
71    mypi = h * sum;</p>
<p>изначально все строилось для MPI , правда захотелось перенести на OpenMP</p>
<p>казалось бы все просто:</p>
<p> 53 #pragma omp parallel for reduction(+: sum)<br />
 54 for (int i = 1; i &lt;= n; i++)<br />
 55    {<br />
 56<br />
 57       x = h * ((double)i - 0.5);<br />
 58       sum +=(4.0 / (1.0 + x*x));<br />
 59    }</p>
<p>(гусары - молчать , пока что ... ).</p>
<p>(компилируем как gcc ./pim.c -o ./pim -O3 -fopenmp -mfpmath=sse)</p>
<p>Практически все (окромя точности, но об этом позже) устраивает и почти красиво, пример Thread Profiler for Linux:</p>
<p>tprofile_cl ./pim<br />
Building project<br />
Instrumenting<br />
 16% pim             ( API Imports ):..</p>
<p>Running:  /mpi/pi/pi/pim</p>
<p>n = 1000000000<br />
Num threads before = 1<br />
myid: 1 i: 0: 0 c:0<br />
mypi: 3.1415926535898211</p>
<p>Application finished</p>
<p>Intel(R) Thread Profiler  3.1  Summary Report<br />
application:          /mpi/pi/pi/pim<br />
collection:           Wed Jan  7 17:52:15 2009<br />
runtime:              3.43215s<br />
# of processors:      4<br />
# of threads:         4<br />
# of waits:           3<br />
wait frequency:       0.874088<br />
average concurrency:  3.96682<br />
Concurrency:<br />
   0 [..........] 0%      0<br />
   1 [..........] 0.913%  0.0301119<br />
   2 [..........] 0.0051% 0.000168224<br />
   3 [..........] 0.349%  0.0114959<br />
   4 [##########] 98.7%   3.25637</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>
<p>вот пример нескольких последовательных, и не только, запусков:</p>
<p>[maxd@fc9i pi]$ time ./pim<br />
n = 1000000000<br />
mypi:   3.1415926535898211</p>
<p>real    0m3.345s<br />
user    0m13.125s<br />
sys     0m0.032s<br />
[maxd@fc9i pi]$ time ./pim<br />
n = 1000000000<br />
mypi:   3.1415926535898211<br />
real 0m55.433s<br />
user 3m38.935s<br />
sys 0m0.033s</p>
<p>В итоге - иногда время работы ~3 сек и очень часто - ~55 сек - крута, 18х slowdown. Что то мы не подкрутили!</p>
<p>посмотрим поглубже и видим что то типа</p>
<p>  400710:       f2 0f 2a c0             cvtsi2sd %eax,%xmm0<br />
  400714:       83 c0 01                add    $0x1,%eax<br />
  400717:       66 0f 28 ea             movapd %xmm2,%xmm5<br />
  40071b:       39 c2                   cmp    %eax,%edx<br />
  40071d:       f2 0f 5c c4             subsd  %xmm4,%xmm0<br />
  400721:       f2 41 0f 59 44 24 08    mulsd  0x8(%r12),%xmm0<br />
  400728:       f2 41 0f 11 44 24 10    movsd  %xmm0,0x10(%r12)<br />
  40072f:       f2 0f 59 c0             mulsd  %xmm0,%xmm0<br />
  400733:       f2 0f 58 c3             addsd  %xmm3,%xmm0<br />
  400737:       f2 0f 5e e8             divsd  %xmm0,%xmm5<br />
  40073b:       f2 0f 58 cd             addsd  %xmm5,%xmm1<br />
  40073f:       7d cf                   jge    400710 &lt;main.omp_fn.0+0x70&gt;</p>
<p>(btw AT&amp;T синтаксис вовсе не дурен)</p>
<p>запустив VTune/PTU увидим впечатляющий CPI (циклов на инструкцию) ~ 45 <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> при желаемом -как можно ближе к 0.25 но меньше 1 уже хорошо . Кстати - саму ошибку уже видно с разных сторон. Для разнообразия запустим Thread Checker for Linux и уже наглядно видим что то типа</p>
<p> tcheck_cl ./pim<br />
Intel(R) Thread Checker 3.1 command line instrumentation driver (26185)<br />
Copyright (c) 2007 Intel Corporation. All rights reserved.<br />
Building project<br />
Instrumenting<br />
 16% pim             ( All Functions ):..</p>
<p>Running:  /mpi/pi/pi/pim</p>
<p>n = 1000000000<br />
Num threads before = 1<br />
myid:   1       i:      0: 0    c:0<br />
mypi:   3.1415926535898211</p>
<p>Application finished<br />
<code><br />
_______________________________________________________________________________<br />
|ID|Short De|Seve|C|Contex|Description                        |1st Acc|2nd Acc|<br />
|  |scriptio|rity|o|t[Best|                                   |ess[Bes|ess[Bes|<br />
|  |n       |Name|u|]     |                                   |t]     |t]     |<br />
|  |        |    |n|      |                                   |       |       |<br />
|  |        |    |t|      |                                   |       |       |<br />
_______________________________________________________________________________<br />
....</code><br />
<code><br />
|3 |Write -&gt;|Erro|2|[pim, |Memory write at [pim, 0x728]       |[pim,  |[pim,  |<br />
|  |Write da|r   |1|0x6a0]|conflicts with a prior memory write|0x728] |0x728] |<br />
|  |ta-race |    |4|      |at [pim, 0x728] (output dependence)|       |       |<br />
|  |        |    |8|      |                                   |       |       |<br />
|  |        |    |7|      |                                   |       |       |<br />
|  |        |    |6|      |                                   |       |       |<br />
|  |        |    |1|      |                                   |       |       |<br />
|  |        |    |1|      |                                   |       |       |</code><br />
 ....</p>
<p> </p>
<p>(форматирование несколько "поехало") - кстати Thread Checker оказался самым быстрым способом борьбы.</p>
<p>Тут даже придумано красивое название - False Sharing: несколько потоков мешают друг другу работая с одним ресурсом. Как другой вариан объяснения - читайте blog недавно были интересные блоги насчет красивых и иногда жизненых примеров для общих проблем.</p>
<p>На четырех ядерной машинке 18х ухудшения - интересно.</p>
<p>Как вылечить ? Например так :</p>
<p> 55 #pragma omp parallel for <strong>private(x)</strong> reduction(+: sum)<br />
 56 for (i = 1; i &lt;= n; i++)<br />
 57    {<br />
 58       x = h * ((double)i - 0.5);<br />
 59       sum +=(4.0 / (1.0 + x*x));<br />
 60    }</p>
<p>добавленое - выделено.</p>
<p>Кстати - исходный код был С где declaration для переменной x было вне цикла, как можно было сделать для С++ и тогда проблемы не было бы вообще.</p>
<p>в итоге наш цикл превращаеться в более простую конструкцию типа:</p>
<p>  400710:       f2 0f 2a c0             cvtsi2sd %eax,%xmm0<br />
  400714:       83 c0 01                add    $0x1,%eax<br />
  400717:       66 0f 28 f3             movapd %xmm3,%xmm6<br />
  40071b:       39 c2                   cmp    %eax,%edx<br />
  40071d:       f2 0f 5c c5             subsd  %xmm5,%xmm0<br />
  400721:       f2 0f 59 c2             mulsd  %xmm2,%xmm0<br />
  400725:       f2 0f 59 c0             mulsd  %xmm0,%xmm0<br />
  400729:       f2 0f 58 c4             addsd  %xmm4,%xmm0<br />
  40072d:       f2 0f 5e f0             divsd  %xmm0,%xmm6<br />
  400731:       f2 0f 58 ce             addsd  %xmm6,%xmm1<br />
  400735:       7d d9                   jge    400710 &lt;main.omp_fn.0+0x70&gt;</p>
<p>которая выполняеться и быстрее и стабильнее.</p>
<p>Насчет точности:</p>
<p>Используемый алгоритм подвержен проблеме округления в частности при использовании OpenMP.</p>
<p>например для использования SSE можно попробывать использовать</p>
<p>gcc ./pim.c -o ./pim -O3 -fopenmp -mfpmath=sse</p>
<p>для FPU:</p>
<p>gcc ./pim.c -o ./pim -O3 -fopenmp -mfpmath=387</p>
<p>результаты будут разные:</p>
<p>sse: 3.1415926535898211<br />
387: 3.1415926535897936<br />
org: 3.14159265358979323846<br />
где org - просто Pi взятое из какой либо википедии, кстати FPU более точнее но об этом я уже как то писал.</p>
<p>Время работы FPU кстати неплохое</p>
<p>sse: real 0m3.280s</p>
<p>fpu: real    0m3.894s</p>
<p> </p>
<p>Присутствующая векторизация в gcc для этого цикла не сработала и пришлось бы менять код.</p>
<p>Intel Compiler сделал вещи шустрее (используя packed arguments instead of scalar ~ векторизация , loop unrolling etc )  и с уже приведенным C кодом :</p>
<p>icc ./pim.c -O3 -xSSSE3 -openmp -vec-report5 -o ./pim.icc</p>
<p>и результат неплох</p>
<p>real    0m1.857s<br />
user    0m6.528s<br />
sys     0m0.033s</p>
<p>За сим прощаюсь с успехом поздравив Вас в удачной оптимизации <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/01/13/openmp-linux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Атомная радость</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/01/12/2000516/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/01/12/2000516/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 07:51:40 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
		
		<category><![CDATA[Открытый код]]></category>

		<category><![CDATA[Управляемость]]></category>

		<category><![CDATA[Atom]]></category>

		<category><![CDATA[NAS]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/01/12/2000516/</guid>
		<description><![CDATA[Итак, свершилось: вчера вечером маленький компьютер на базе Intel Atom окончательно сменил дорогущий NAS Qnap TS-209 Pro II и приступил к выполнению кучи обязанностей разом.
Теперь, когда все позади, хотелось бы выразить недоумение по поводу самой идеи домашних NAS в ее нынешнем воплощении. У меня стоял, пожалуй, лучший из доступных на рынке вариантов. 500-мегагерцовый процессор, 256 [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, свершилось: вчера вечером маленький компьютер на базе Intel Atom окончательно сменил дорогущий NAS Qnap TS-209 Pro II и приступил к выполнению кучи обязанностей разом.</p>
<p>Теперь, когда все позади, хотелось бы выразить недоумение по поводу самой идеи домашних NAS в ее нынешнем воплощении. У меня стоял, пожалуй, лучший из доступных на рынке вариантов. 500-мегагерцовый процессор, 256 мегабайт ОЗУ, гигабитный Ethernet-контроллер, Linux с человеческим лицом - казалось бы, все должно работать, как надо. Ан нет! Максимальная скорость скачивания торрентов не превышала 250 Кбайт/с, хотя Интернет-канала с лихвой хватает на четыре с лишним сотни. Скорость отдачи вообще не превышала 20 Кбайт/с. Банальное копирование файлов с компьютера на NAS загружало минимум половину (!) вычислительной мощи процессора, а если копировать напрямую на внешний накопитель по USB, загрузка составляла всю сотню процентов. Причем скорость скачивания по USB составляла 6 (шесть) мегабайт в секунду, то есть медленнее, чем по 100-мегабитному Ethernet. Как такое возможно - не понимаю.</p>
<p>Ну и не стоит забывать о проблеме шума. Посадив винчестеры и кулер на резиновые прокладки, я таки сделал коробочку пригодной для домашнего использования, но почему в Qnap-то на них сэкономили? Ведь, при всем уважении, себестоимость TS-209 Pro II в разы меньше пяти сотен баксов, которые за него просят.</p>
<p>Чтобы не быть голословным, публикую смету своей альтернативы NAS'ам.</p>
<p>1) Материнская плата Intel Little Falls 2 DG945CLF2 с напаянным Atom 330 (2 ядра) - $85</p>
<p>2) Корпус <span style="x-small;">Morex Cubid 2600RSB (его пример есть, к примеру, тут: <a href="http://dont.ru/Morex-Cubid-2600RSB-P/n:-106304.id3595.html">http://dont.ru/Morex-Cubid-2600RSB-P/n:-106304.id3595.html</a>) - $103</span></p>
<p><span style="x-small;">3) Две "глушилки" для пропеллеров, чтобы не крутились слишком быстро - $5.</span></p>
<p><span style="x-small;">4) Двухгигабайтный модуль Samsung DDR2 - $18 (хотя тут я перестраховался, для наших задач достаточно одного гига, так что минус $6)</span></p>
<p><span style="x-small;">Итого железо нам обходится в $205. Терабайтный винчестер - еще примерно $125. К сожалению, в моей модели корпуса только одно посадочное место для 3.5-дюймовых версий, но ничто не мешает поставить по соседству еще один ноутбучный (до 500 гигабайт) или прицепить снаружи USB-накопитель любой емкости.</span></p>
<p><span style="x-small;">Конечно, есть еще тонкий момент с операционной системой, которая не всегда бесплатна. Самое удобное - поставить Windows XP Pro и управлять малышом при помощи встроенного удаленного рабочего стола. Но это еще и недешево: XP Pro в наших краях продают по $150. Можно ограничиться XP Home и каким-нибудь бесплатным аналогом RAdmin'а, коих развелось изрядно. А для серьезных парней существует уйма бесплатных дистрибутивов Linux, которые, уверен, тоже позволяют настроить удаленное управление системой. Лично я поставил XP Pro, и сейчас жду, пока по почте придет пробная версия Windows Home Server, которая, по слухам, идеально подходит для моих задач. Приятно, что дистрибутив с трехмесячным Trial'ом можно заказать на сервере Microsoft совершенно бесплатно.</span></p>
<p><span style="x-small;">А о том, как я на двухъядерном Atom'е жму видео для PSP, расскажу в следующий раз <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/01/12/2000516/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
