<?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; Victor Cherepanov (Intel)</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/author/victor-cherepanov/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>Acceler8 2011 — Accelerate 2012 — и так далее</title>
		<link>http://software.intel.com/ru-ru/blogs/2012/05/10/acceler8-2011-accelerate-2012/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/10/acceler8-2011-accelerate-2012/#comments</comments>
		<pubDate>Thu, 10 May 2012 17:14:14 +0000</pubDate>
		<dc:creator>Victor Cherepanov (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Конкурсы и мероприятия]]></category>
		<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[конкурс]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/10/acceler8-2011-accelerate-2012/</guid>
		<description><![CDATA[Вы участвовали в конкурсе параллельного программирования Acceler8 2011? Тогда этот пост - про вас. Вы участвуете в проходящем сейчас конкурсе Аccelerate-2012? Тогда этот пост - для вас. Вы принимали участие или только планируете участвовать в любом конкурсе спортивного программирования? А может, собираетесь начать свой первый самостоятельный проект? Тогда Вас, Штирлиц, я попрошу остаться с нами. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://habrastorage.org/storage2/fb5/652/b2a/fb5652b2a0c177524b2d861ba2c0bdfc.jpg" align="right" /><br />
Вы участвовали в конкурсе параллельного программирования <a href="http://habrahabr.ru/company/intel/blog/130588/">Acceler8 2011</a>? Тогда этот пост - про вас.<br />
Вы участвуете в проходящем сейчас конкурсе <a href="http://habrahabr.ru/company/intel/blog/142312/">Аccelerate-2012</a>? Тогда этот пост - для вас.<br />
Вы принимали участие или только планируете участвовать в любом конкурсе спортивного программирования? А может, собираетесь начать свой первый самостоятельный проект? Тогда Вас, Штирлиц, я попрошу остаться с нами. </p>
<p>Этот пост - "разбор полетов" прошлогоднего  конкурса Intel - Acceler8 2011, выполненный одним из членов жюри. Он прокомментировал  ключевые конкурсные моменты, а также дал  банальные и&nbsp;очевидные, но до сих пор актуальные советы по участию в подобных соревнованиях и по ведению проектов.</p>
<p>Итак,  поехали!</p>
<p>Первое, с&nbsp;чем столкнулись организаторы&nbsp;&mdash; это искренний интерес участников, живое общение в&nbsp;блогах и&nbsp;форумах. Скажу честно, решения участников, которые много &laquo;наследили&raquo; в&nbsp;форуме, мы&nbsp;рассматривали с&nbsp;особым пристрастием. У&nbsp;каждого члена жюри были свои любимчики, но&nbsp;на&nbsp;конечный результат соревнования это никак не&nbsp;повлияло, так как у&nbsp;тестовой машины не&nbsp;было предпочтений.</p>
<h4>Задача конкурса</h4>
<p>Ох, каких только нелестных эпитетов выслушали организаторы конкурса по&nbsp;поводу <a href="http://software.intel.com/ru-ru/articles/contest-acceler8-2011-problem/">поставленной задачи</a>. Методом проб и&nbsp;ошибок она была приведена к&nbsp;более-менее приемлемому виду. Но&nbsp;после получения первых решений, мы&nbsp;осознали насколько она была богата на&nbsp;различные оптимизации. Основной упор участники (ожидаемо) сделали на&nbsp;вычисление &laquo;периодических&raquo; матриц и&nbsp;параллелизацию. Но&nbsp;некоторые конкурсанты также сделали теоретические исследования алгоритма, оптимизации выделения памяти и&nbsp;хранения матриц, их&nbsp;заполнения, способов их&nbsp;обхода. В&nbsp;глазах жюри конкурса такой подход к&nbsp;решению задачи прибавлял минимум +100&nbsp;к карме участника.</p>
<p><i>Совет</i>: в&nbsp;мире существуют много способов написания приложений, но&nbsp;наибольшей популярностью пользуется <b>метод северо-западного угла</b>. Это когда курсор ставится в&nbsp;верхний левый угол экрана и&nbsp;начинается набивка кода. Это неправильный метод. Никогда не&nbsp;приступайте к&nbsp;реализации проектов сразу, начните с&nbsp;изысканий на&nbsp;бумаге, разбейте весь проект на&nbsp;интерфейсы-функции-модули. Возможно, вы&nbsp;наткнётесь на&nbsp;сложности и&nbsp;тонкие моменты сразу, что сэкономит вам много человеко-часов позже, перед сдачей проекта.</p>
<h4>Качество кода</h4>
<p>Тут организаторы конкурса прочувствовали истинность народной китайской поговорки &laquo;не&nbsp;важно какого цвета кошка, если она ловит мышей&raquo;. Каких только витиеватых конструкций и&nbsp;выражений не&nbsp;было в&nbsp;коде. Организаторы вспомнили свою юность, когда писали почти так&nbsp;же. Приведу TOP-5 &laquo;неловких&raquo; мест в&nbsp;проектах:</p>
<p><b>5&nbsp;место</b> (хитрая инициализация указателя в&nbsp;конструкторе): <code>m_memory_pointer((char*)this + 1024)</code><br />
<b>4&nbsp;место</b> (инициализация переменной): <code>static const int min_int = -2147483648;</code><br />
<b>3&nbsp;место</b>: сравнение структуры с&nbsp;указателем. Как это вообще скомпилировалось под Linux?<br />
<b>2&nbsp;место</b>: main.c файл на&nbsp;1900&nbsp;строк. Парни, серьёзно, как вы&nbsp;в&nbsp;нём ориентируетесь?<br />
<b>1&nbsp;место</b> (почти десяток претендентов): несоблюдение формата ввода-вывода.</p>
<p>Иногда мозг просто взрывался, пытаясь понять, что имели ввиду участники. Отсутствие комментариев только усугубляло общую картину (хотя вру, в&nbsp;паре файлов код терялся среди комментариев). Но&nbsp;что самое поразительное - иногда эти сложные нечитаемые конструкции работали, работали правильно, работали быстрее всех.</p>
<p>Проблема, с&nbsp;которой могут столкнуться разработчики, если будут писать проекты в&nbsp;таком стиле,&nbsp;&mdash; это поддержка и&nbsp;сопровождение кода. Порой, проекты длятся годами, и&nbsp;если в&nbsp;момент завершения проекта разработчики помнят, что они написали, то&nbsp;уже через месяц могут и&nbsp;не&nbsp;разобрать. На&nbsp;наш взгляд, основной причиной невысокого качества кода стала нехватка времени. И даже после того, как организаторы продлили временные рамки конкурса. Рискну предположить, что почти все участники сидели безвылазно за&nbsp;своими компами в&nbsp;выходные перед завершением конкурса.</p>
<p><i>Совет</i>: разбейте весь проект на&nbsp;небольшие этапы, и&nbsp;реализуйте по&nbsp;одному этапу каждый день: общая инфраструктура приложения-основной алгоритм-тесты-оптимизации основного алгоритма. Пишите код так, как будто за&nbsp;его красоту и&nbsp;читабельность будет осуществляться пропуск в&nbsp;рай или в&nbsp;ад. Надеюсь, что все в&nbsp;курсе, что теперь правилами хорошего тона при написании резюме программистами считается указывать свой внешний репозиторий? Это делается для того, чтобы потенциальный работодатель мог ознакомится с&nbsp;навыками соискателя работы. Реально, красивый и&nbsp;читабельный код открывает двери так&nbsp;же быстро, как нечитабельный код их&nbsp;закрывает.</p>
<h4>Качество алгоритмов</h4>
<p>Признаюсь, моим фаворитом в&nbsp;прошедшем конкурсе была команда <b>KomsomolskDV</b>. Чувствуется, что парни имеют достаточно богатый опыт участия в&nbsp;подобных соревнованиях. Они подошли к&nbsp;исследованию алгоритма до&nbsp;такой степени педантично, что даже вычислили теоретическое время работы алгоритма в&nbsp;тактах. Если&nbsp;бы все участники провели&nbsp;подобные исследования, то&nbsp;нам&nbsp;бы не&nbsp;пришлось запускать приложения. Достаточно&nbsp;бы было сравнить теоретические времена вычислений.<br />
Также некоторые участники описали в&nbsp;своих сопроводительных документах ход их&nbsp;мыслей, с&nbsp;чего они начинали, как развивалась их&nbsp;мысль.<br />
Если представить ход мыслей участников в&nbsp;виде графика (хм, интересно, возможен&nbsp;ли такой график?), то&nbsp;до&nbsp;каких-то базовых улучшений додумались почти все участники. С&nbsp;ростом хитрости и&nbsp;сложности какой-то идеи количество справившихся участников резко падало.</p>
<p>Если посмотреть на&nbsp;финальную <a href="http://software.intel.com/ru-ru/articles/contest-acceler8-2011-winners/">таблицу с&nbsp;результатами</a>, то&nbsp;можно увидеть, что первые пять мест сильно дифференцируются по&nbsp;производительности от&nbsp;других. Знаете почему? Потому, что эти команды придумали чуть более нетривиальные решения, чем остальные участники.</p>
<p><i>Совет</i>: Проведите теоретические исследования задач конкурса на&nbsp;бумаге, порисуйте схемы и&nbsp;картинки. Возможно, что вы&nbsp;обнаружите какие-то тонкости или уязвимости алгоритма, делающие его решение много быстрее, что даст вам преимущество перед другими участниками соревнования.</p>
<p>В&nbsp;заключение хочу сказать, что участники конкурса доставили много весёлых минут организаторам.<br />
<i>Почти совет</i>: Относитесь к&nbsp;программированию, как серьёзной игре. С&nbsp;одной стороны, всё должно работать, с&nbsp;другой&nbsp;&mdash; процесс разработки должен приносить радость. </p>
<p>Например, почему&nbsp;бы не&nbsp;оставить в&nbsp;комментариях &laquo;послание&raquo; будущим поколениям?</p>
<p>cross-post from <a href="http://habrahabr.ru/company/intel/blog/142982/">habrahabr.ru</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/10/acceler8-2011-accelerate-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>История развития форматов видеосжатия</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/11/30/2006243/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/11/30/2006243/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 20:23:00 +0000</pubDate>
		<dc:creator>Victor Cherepanov (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Графика]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[digital video]]></category>
		<category><![CDATA[h.264]]></category>
		<category><![CDATA[hevc]]></category>
		<category><![CDATA[Intel]]></category>
		<category><![CDATA[mediaSDK]]></category>
		<category><![CDATA[mpeg]]></category>
		<category><![CDATA[mpeg2]]></category>
		<category><![CDATA[MPEG4]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[Pentium]]></category>
		<category><![CDATA[quick sync]]></category>
		<category><![CDATA[Sandy Bridge]]></category>
		<category><![CDATA[svc]]></category>
		<category><![CDATA[цифровое видео]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/11/30/2006243/</guid>
		<description><![CDATA[<p>Далёкий 1988й год был полон удивительных событий. В этом году увидел свет 4й альбом группы Metallica «<a href="http://en.wikipedia.org/wiki/...And_Justice_for_All_(album)">...And justice for all</a>», а СССР запустил в свой первый и единственный полёт многоразовый космический корабль «<a href="http://ru.wikipedia.org/wiki/%D0%91%D1%83%D1%80%D0%B0%D0%BD_(%D0%BA%D0%BE%D1%81%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BE%D1%80%D0%B0%D0%B1%D0%BB%D1%8C)">Буран</a>». В этом же году началась история видеосжатия – появился самый первый стандарт видео-кодека.<br />
Самые известные стандарты видеосжатия появились благодаря двум конторам: <abbr title="Video Coding Expert Group">VCEG</abbr> и <abbr title="Moving Picture Expert Group">MPEG</abbr>. Нельзя назвать их конкурентами: некоторые стандарты были выпущены комитетами поодиночке, некоторые стали плодом их <s>запретной любви</s> коллективной работы в составе объединённых групп. По иронии судьбы именно эти «совместные» форматы и получили наибольшее распространение.</p><br />
]]></description>
			<content:encoded><![CDATA[<p>Далёкий 1988й год был полон удивительных событий. В этом году увидел свет 4й альбом группы Metallica «<a href="http://en.wikipedia.org/wiki/...And_Justice_for_All_(album)">...And justice for all</a>», а СССР запустил в свой первый и единственный полёт многоразовый космический корабль «<a href="http://ru.wikipedia.org/wiki/%D0%91%D1%83%D1%80%D0%B0%D0%BD_(%D0%BA%D0%BE%D1%81%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BE%D1%80%D0%B0%D0%B1%D0%BB%D1%8C)">Буран</a>». В этом же году началась история видеосжатия – появился самый первый стандарт видео-кодека.<br />
Самые известные стандарты видеосжатия появились благодаря двум конторам: <abbr title="Video Coding Expert Group">VCEG</abbr> и <abbr title="Moving Picture Expert Group">MPEG</abbr>. Нельзя назвать их конкурентами: некоторые стандарты были выпущены комитетами поодиночке, некоторые стали плодом их <s>запретной любви</s> коллективной работы в составе объединённых групп. По иронии судьбы именно эти «совместные» форматы и получили наибольшее распространение.</p>
<p></p>
<h2>1988 год – H.261</h2>
<p></p>
<p><img style="padding: 8px;"  src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/cif_resolution.jpg" alt="352x288 - предел мечтаний в 1988 году" align="left" />Итак, 1988 год. <a href="http://en.wikipedia.org/wiki/H.261">H.261</a> стал первым полноценным форматом видеосжатия, получившим широкое распространение. Это был «классический» стандарт, работающий в цветовом пространстве YCbCr, базирующийся на дискретном косинусном преобразовании блоков и сжатии Хаффмана. Поднимите руку те, кто слышал о нём? А ведь именно в этом стандарте впервые появились такие понятия, как макро-блок, целопиксельный вектор движения и де-блокинг (или пост-процессинг). А еще именно тогда, 23 года назад, появилась концепция опорных кадров. H.261 предусматривал кадры 2х типов: I(ntra) – полностью независмый кадр, и P(redicted) – кадр, зависимый от предыдущего. Максимальное разрешение CIF (пример приведён слева), поддерживаемое H.261, сейчас не впечатлит даже любителей смотреть видео на телефоне. И тем не менее, для своего времени это был очень прогрессивный, весьма «продвинутый» стандарт. Все последующие стандарты видеосжатия базируются на идеях, берущих свое начало в H.261, и де-факто являются результатом его эволюционного развития.</p>
<p>&nbsp;<br />
<h2>1993 год – MPEG1</h2>
<p></p>
<p>В 1993 появился <a href="http://en.wikipedia.org/wiki/Mpeg1">MPEG1</a>. Революционным нововведением в формате MPEG1 стали B(ipredicted) кадры. Т.е. кадры могли теперь предсказываться не только от предшествующего опорного кадра, но и последующего. Появились полупиксельные вектора движения, что позволило поднять точность предсказания и тем самым повысить качество. Было введено понятие «слайс» (Slice) – часть кадра (группа макроблоков), которая кодируется независимо от других слайсов. Стало возможным сжимать разные части кадра с разными параметрами, но, самое главное, в MPEG1 появилась поддержка очень больших разрешений, вплоть до 4К на 4К.<br />
По непонятной причине, комитет MPEG выкинул из стандарта этап де-блокинга. Комитет даже не убедило существенное повышение качества, достигнутое при использовании де-блокинга в стандарте H.261. Скорее всего, решение было основано на данных о типичной производительности микропроцессоров того времени. В отличие от H.261, стандарт MPEG1 состоял из нескольких частей, описывающих всё необходимое для полноценного цифрового видео: аудио сжатие, видео сжатие, хранение и синхронизация аудио-видео данных, средства тестирования совместимости и референсный декодер для отладки.</p>
<p>В начале девяностых годов в компании Intel, да и вообще в компьютерной индустрии, вряд ли существовало полное понимание того, какое влияние в будущем окажет видеокодирование на архитектуру процессоров. Это много позже сжатие и разжатие цифрового видео стало коньком компании. А пока, в марте 1993, начал свою долгую жизнь один из самых известных процессоров компании Intel – Pentium. В нем не было ничего особенного для ускорения видео-обработки, разве что одинокая инструкция bsr (bit scan reverse). Эта инструкция осталась еще со времён 386го процессора и могла быть использована для ускорения декодирования Хаффмана. Производительности Pentium’а хватало, чтобы тихонько декодировать H261 формат. Но без звука <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Надеюсь, некоторые читатели еще помнят, как икал winamp, если пошевелить мышкой.</p>
<h2>1996 год – MPEG2</h2>
<p></p>
<p>1996 год. Опубликован стандарт <a href="http://en.wikipedia.org/wiki/Mpeg2">MPEG2</a>. Совсем скоро разойдутся по планете миллионными тиражами DVD диски, которые сделают MPEG2 первым широко распространенным форматом на многие годы. MPEG2 практически не принёс ничего нового в процесс сжатия, за исключением черезстрочного видео, поддержки нескольких форматов аудио-сжатия и дополнительных цветовых разрешений. MPEG2 не был оптимизирован для использования на маленьких (меньше 1мбит) потоках. Зато на бОльших потоках MPEG2 уверенно превосходил MPEG1, а сам стандарт разросся до 11 частей.</p>
<p><img style="padding: 8px;"  src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/pentium_mmx_logo_small.png" alt="Pentium MMX logo" align="left" />
<p>В начале 1997 года Intel начала продавать процессоры, которые уже были способны декодировать видео с приемлемой скорость. Нет, про HDTV разрешения ещё никто не мечтал, но маленькое QCIF видео процессор уже способен был проигрывать без тормозов. «Виновница» этого – технология <a href="http://en.wikipedia.org/wiki/MMX_(instruction_set)">MMX</a>. Врядли выход стандарта MPEG2 и технологии MMX с такой маленькой разницей во времени было чистым совпадением. С большой вероятность это был, как сейчас принято говорить, продукт синэргии.</p>
<p>Технология MMX состояла из набора дополнительных 57 инструкций и 8 новых 8ми-байтных регистров. Существенное ускорение (до 3х-4х раз) достигалось за счёт одновременной обработки инструкцией нескольких данных. В этом плане цифровое видео стало идеальным полем для внедрения новой технологии. На MMX возлагали большие надежды, и даже поместили на официальное лого процессора.<br />
Чуть позже в этом же году вышел процессор <a href="http://en.wikipedia.org/wiki/Pentium_II">Pentium II</a>, который за счёт своей суперскалярности, большого кэша, шустрой шины и нового типа памяти сделал доступным просмотр DVD на персональном компьютере.</p>
<h2>1998 год – MPEG4</h2>
<p></p>
<p><a href="http://en.wikipedia.org/wiki/Mpeg4">MPEG4</a>, появившийся в 1998 году, достаточно быстро завоевал себе славу «пиратского» формата. Кодек DivX, использующий MPEG4 формат, произвёл настоящий фурор. DivX позволял с приемлемой потерей качества сжимать MPEG2 DVD диск в файл размером с CD диск. Я помню, как многие мои друзья кинулись пережимать DVD фильмы (откуда они их брали???) и делать свою личную коллекцию DivX фильмов.<br />
Успех формата MPEG4 состоял из нескольких слагаемых: вектора движения стали четверть-пиксельными, что позволило поднять точность предсказания, макроблок мог содержать уже до 4 векторов движения, что было полезно на границе движущихся объектов, и (фанфары!) вернулся незаслуженно уволенный пять лет назад де-блокинг.<br />
Разработчики стандарта добавили в MPEG4 ещё одну интересную вещь: intra-предсказание. Теперь макроблоки в I-кадрах могли «предсказываться» от соседних макроблоков, что существенно снижало размер intra макроблоков в кадрах со сложной, но повторяющейся структурой.<br />
К сожалению, сам стандарт сжатия, а вернее его чрезмерные способности, не нашли горячего отклика в лице производителей кодеков. Многие прогрессивные фишки MPEG4, такие как 3D видео текстуры, несколько видеоплоскостей в кадре и прочее, остались невостребованными.</p>
<p><img style="padding: 8px;"  src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/pentium_III_logo_small.png" alt="Pentium III ускоряющий интернет" align="left" />С другой стороны, многократно возросшая сложность декодирования опять отбросила пользователей в область маленьких разрешений. Однако, не прошло и года, как в продаже появился Pentium III, «ускоряющий Интернет». К слову, <a href="http://en.wikipedia.org/wiki/Pentium_III">Pentium III</a> отлично справлялся с задачами ускорения всего, не только интернета. В то время были популярными эксперименты запуска игры Quake 3 Arena на новом процессоре, который после патча системы обеспечивал значительное приращение FPS. С точки зрения видеокодирования, процессор принёс возможности программного опережающего чтения (prefetch) данных в кэш и расширял набор MMX несколькими крайне полезными инструкциями. И хотя ускорение декодирования видео было всего 20-30% по сравнению с Pentium II, этого было достаточно для комфортного просмотра MPEG4 фильмов.</p>
<p>&nbsp;
<p><img style="padding: 8px;"  src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/pentium_4ht_logo_small.png" alt="Один из самых приятных процессоров для оптимизации" align="left" /> Приверженцы продукции Intel встречали 2000й год с особыми нетерпением. Именно на этот год был назначен выпуск нового процессора Intel <a href="http://en.wikipedia.org/wiki/Pentium_4">Pentium 4</a>. Это была великая интрига и великая загадка – компания готовилась полностью сменить архитектуру процессора. Архитектура NetBurst шла на смену казавшейся устаревшей архитектуры P6. И хотя общая производительность процессора слегка разочаровала фанатов, с точки зрения обработки цифрового видео процессор был на высоте. Новые инструкции и новые 16ти-байтные регистры <a href="http://en.wikipedia.org/wiki/Sse2">SSE2</a>, хитрые режимы аппаратного предсказания, большие буффера чтения/записи, новая организация кэша, а чуть позже – технология <a href="http://en.wikipedia.org/wiki/Hyperthreading">HyperThreading</a>. Всё это вдохнуло новую жизнь в процесс оптимизации видеокодеков. Прирост производительности колебался от 10 до 35%. Процессор Pentium 4 был раздольем для экспериментов. Например, 2 инструкции, переставленные местами, могли равновероятно принести как 5% увеличения скорости работы кодека, так и 5% замедления. Процессора вполне хватало на декодирование и видео, и аудио, и еще оставалось немножко производительности на спец-эффекты. Вкладка эффектов DivX росла и ширилась, и счастливые обладатели топовых версий Pentium 4 расставляли все галочки, в надежде получить картинку «как в кинотеатре». А раз уж речь зашла о кинотеатре, то энтузиасты начали всерьез посматривать в сторону HD разрешений.</p>
<h2>Новейшая история, год 2003 – H.264</h2>
<p></p>
<p>Год 2003 можно смело назвать эпохальным годом в истории развития форматов видеосжатия: появилась альфа и омега сегодняшнего цифрового видео — стандарт <a href="http://en.wikipedia.org/wiki/H264">H.264</a>. Новый стандарт был полностью целочисленным, т.е. все этапы декодирования видео выполнялись в целых числах, благодаря чему была достигнута побитовая идентичность видео при декодировании декодерами разных производителей.<br />
От предков H.264й отличался продвинутым intra-предсказанием макроблоков, различным разбиением макроблоков при компенсации движения (от 4x4 до 16x16), 6ти точечным фильтром компенсации движения, продвинутым арифметическим сжатием энтропии, наличием долго-хранящихся опорных кадров, гибким управлением опорными кадрами, 16 векторами на макроблок, всеми доступными цветовыми разрешениями, 8мью и более битами на компонент цвета и множеством других волшебных фишек. Стандарт не только оставил далеко позади всех конкурентов, но и установил новые требования к производительности процессора. Теперь, чтобы проигрывать видео в формате HD, одного процессора (даже с технологией HyperThreading) уже недостаточно.</p>
<p>Период 2003-2005 годов был тяжёлым для пользователей, которым не хватало производительности, но золотым временем для оптимизаторов ПО. Их услуги были на расхват! Производительность ЦПУ явно была в дефиците, и с этим надо было что-то делать. В мае 2005 решение пришло – впервые со времён процессора Pentium III многоядерность вернулась в пользовательские машины. Процессор Pentium 4 с кодовым названием <a href="http://en.wikipedia.org/wiki/Pentium_D">Smithfield</a> гордо нёс свои 2 ядра в массы. На самом деле, компания Intel слукавила – это были 2 «почти» обычных процессора Pentium 4, расположенные на одной подложке. Процессоры могли общаться друг с другом исключительно через шину FSB, не могли «подглядывать» соседу в кэш. Тем не менее, производительности Smithfield’а было достаточно, чтобы на лицах пользователей снова засветилась улыбка. Покупайте попкорн, занимайте места в «зрительном» зале. Только благодаря многоядерности в многолетней битве между процессорами и форматами цифрового видео наметился перелом: процессоры стали способны декодировать цифровое видео в любом формате, в любом разрешении с комфортной для зрителя скоростью. Но это был лишь выигранный бой, но не сражение.<br />
Как мы знаем, цифровое видео можно (и нужно) не только ДЕкодировать, но и в первую очередь кодировать. А вот с этим всё было не так радужно, как того бы хотелось. Для полноценного, быстрого и качественного сжатия видео современных процессоров хватало разве что на стандартное разрешение формата MPEG2/MPEG4, не более.</p>
<p><img style="padding: 8px;"  src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/core-2-duo_logo_small.png" alt="Conroe принёс ностальгию по временам Pentium III" align="left" />
<p>Городок Конро на юго-востоке штата Техас был практически неизвестен до лета 2006 года, когда на прилавках магазинов стали поставляться новые процессоры компании Intel с одноимённым ядром, вернее ядрами. Дальний потомок процессора Pentium III Intel <a href="http://en.wikipedia.org/wiki/Conroe_(microprocessor)">Core 2</a> был призван заменить процессоры на базе технологии NetBurst, и закрепить успехи видео(де)кодирования. Процессор обладал полноценными высокопроизводительными ядрами, которые могли достаточно эффективно лазить друг другу в большой кэш, и новыми инструкциями <a href="http://en.wikipedia.org/wiki/SSSE3">SSSE3</a> (3 буквы S). Среди новых инструкций было несколько ориентированных специально на кодирование видео. И хотя новые процессоры потеряли поддержку HyperThreading, они всё равно обладали такой внушительной производительностью, что сжатие HD видео в реальном времени уже не выглядело совсем непосильной задачей.</p>
<p>Однако, как уже было замечено, появление многоядерности принесло победу в бою, но не в сражении. Осенью 2007 года объединённая группа комитетов наносит ответный удар в виде нового профиля масштабируемого сжатия к стандарту H264 <a href="http://en.wikipedia.org/wiki/Scalable_Video_Coding">Scalable Video Coding</a> (SVC). Сложность кодирования и декодирования возрастает в разы. Это был не полноценный стандарт, а всего лишь настройка над существующим, основная задумка которого – существенное повышение качества видео, передаваемого по сетям с потерями. Теперь в видео потоке один и тот же фильм мог храниться в разных разрешениях, и более высокие разрешения использовали более низкие в качестве опорных. У такого решения был ещё один дополнительный плюс: теперь устройства, которые не нуждалось в HD качестве фильма, могли декодировать только часть потока с необходимым разрешением.</p>
<p>Но ничто уже не могло поменять ситуацию в обратную сторону. Компания Intel в начале 2008 закрепляет свой успех выходом процессора на ядре <a href="http://en.wikipedia.org/wiki/Penryn_(microprocessor)">Penryn</a> с новыми инструкциями <a href="http://en.wikipedia.org/wiki/SSE4">SSE4.1</a>. Как скажут позже – это было самое большое SIMD расширение со времён процессора Pentium III. Тут были и абсолютно новые инструкции, заточенные на кодирование цифрового видео, и новые расширения для уже существующих SIMD инструкций. Кодирование HD видео в формате H264 уже уверенно движется в реальном времени с приемлемым качеством.<br />
Вышедший в ноябре 2009 новый профиль для кодирования видео снятого с нескольких точек для формата H264 <a href="http://en.wikipedia.org/wiki/Multiview_Video_Coding">Miltiview video coding</a> (MVC) не мог ничего изменить. Новый профиль не добавлял ничего нового, просто описывал правила и способы организации битового потока для сжатия видео снятого с нескольких камер. Не смотря на то, что производительности процессоров 2009 года не хватало, чтобы сжимать подобное видео в реальном времени, это был вопрос одного, максимум двух поколений процессоров.</p>
<p><img style="padding: 8px;" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/intel_core_i7_logo_small.png" alt="Переход на встроенный контроллер памяти дал много" align="left" />
<p>Так и произошло. На рынок вышел процессор с кодовым именем <a href="http://en.wikipedia.org/wiki/Nehalem_(microarchitecture)">Nehalem</a>, снова подаривший нам радость использования технологии HyperThreading. Среди прочих достоинств процессор нёс на себе контроллер памяти и кольцевую шину, которая более подходила для связи между большим количеством быстрых ядер, чем морально-устаревшая FSB. Процесс сжатия HD фильма в отличном качестве, который раньше занимал всю ночь, теперь пролетает за «считанные» часы. В воздухе витал дух победы. Однако, компания Intel была бы не компания Intel, если бы не поставила красивый заключительный аккорд в этой борьбе.</p>
<p><img style="padding: 8px;"  src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/intel_core_i7sb_logo_small.png" alt="SandyBridge кодировал видео быстрее всех ЦПУ" align="left" />
<p>И он прозвучал: в январе 2011 было объявлено о начале продаж процессора на ядре <a href="http://en.wikipedia.org/wiki/Sandybridge">SandyBridge</a>. Кто вертел фирменную синюю коробочку упаковки процессора, наверняка заметили слова Intel Quick Sync среди списка features процессора. Именно так называется технология аппаратного сжатия видео, которая доступна каждому пользователю через <a href="http://software.intel.com/en-us/articles/vcsource-tools-media-sdk-beta">Intel media SDK</a>. За этими тремя простыми английскими словами скрывается труд десятков инженеров и программистов компании, в том числе и мой.</p>
<p>В 2002 году я разговаривал с одним своим коллегой насчёт оптимизации и мультимедиа-ориентированности современных процессоров (как вы помните, время господства технологии SSE2). И на какой-то мой довод коллега ответил, что процессоры станут мультимедиа-ориентированными только тогда, когда там появится инструкция idct. Могли ли мы предположить в далёком 2002, что спустя всего 9 лет жизнь оправдает гораздо более смелые планы и ожидания?</p>
<p>Теперь сжатие видео для любимого iPad – не проблема. HD сериал из 24 серий по 20 минут кодируется за 20 минут. Фильм на 1.5 часа кодируется за 5 минут. Больше не надо тратить своё время и оставлять компьютер включенным на ночь. Достаточно просто сходить и налить чай. Процессоры победили.</p>
<p>PS: На этом я хотел бы закончить своё повествование, но это было бы лукавством. В воздухе опять пахнет бурей. Дело в том, что объединенная группа комитетов разрабатывает следующий стандарт сжатия цифрового видео – <a href="http://en.wikipedia.org/wiki/High_Efficiency_Video_Coding">High Efficiency Video Coding</a> (HEVC). HEVC будет нести в себе лучшие качества H264 формата, но при этом будет обладать огромным количеством новых особенностей и возможностей, которые предъявят повышенные требования к ЦПУ. И борьба между стандартами видеосжатия и процессорами может выйти на новый виток. И так до бесконечности.</p>
<p>Upd. Я уверен, что со временем программные средства развивались, и некоторые негативные эффекты, описанные в статье, со временем прошли. Например, winamp перестал «икать» на медленных процессорах.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/11/30/2006243/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Правильная параллелизация</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/07/20/2001715/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/07/20/2001715/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 13:02:20 +0000</pubDate>
		<dc:creator>Victor Cherepanov (Intel)</dc:creator>
				<category><![CDATA[Графика]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[digital video]]></category>
		<category><![CDATA[h264]]></category>
		<category><![CDATA[optimization]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/07/20/2001715/</guid>
		<description><![CDATA[Давным-давно, лет 9 назад, многопроцессорные системы были не так распространены, как сейчас, и проблемы правильной параллелизации «тяжёлых» приложений мало кого интересовали. Всё поменялось с выходом в массы процессоры Pentium 4 с ядром Northwood. Присутствовавшая в нём технология HyperThreading делала многопоточность доступной массовому потребителю. А с выходом процессоров семейства CoreDuo распараллеливание «тяжёлых» вычислений окончательно закрепилось в [...]]]></description>
			<content:encoded><![CDATA[<p>Давным-давно, лет 9 назад, многопроцессорные системы были не так распространены, как сейчас, и проблемы правильной параллелизации «тяжёлых» приложений мало кого интересовали. Всё поменялось с выходом в массы процессоры Pentium 4 с ядром Northwood. Присутствовавшая в нём технология HyperThreading делала многопоточность доступной массовому потребителю. А с выходом процессоров семейства CoreDuo распараллеливание «тяжёлых» вычислений окончательно закрепилось в категории must have для любого мало-мальски уважающего себя приложения.</p>
<p>Не секрет, что способов и схем параллелизации существует огромное множество. Все они отличаются эффективностью использования всех процессорных ядер и объёмом дополнительной памяти, необходимой для работы алгоритма. Здесь и далее под термином «способ» я буду подразумевать способ декомпозиции данных для параллелизации, а под термином «схема» - схему взаимодействия рабочих потоков между собой. В данной заметке я бы хотел поделиться историей внедрения распараллеливания в декодер видео стандарта H264.</p>
<p>Когда нам поставили задачу эффективно использовать 2 ядра, декодер содержал только последовательный код. Чтобы сделать декодер  многопоточным предстояло полностью переписать его внутреннее устройсто.<br />
Мы пошли по пути наименьшего сопротивления. Т.к. процесс декодирования видео стандарта H264 состоит из нескольких независимых этапов, самого декодирования и процесса исправление ошибок квантизации - «деблокинга», первое решение было сделать так, чтобы эти этапы выполнялись в разных потоках. От нас практически не потребовалось вносить в декодер какие-либо значительные изменения. Этот способ параллелизации дал декодеру существенное ускорение при использовании второго процессора, однако до заветных 2х было ещё далеко. К тому же, нагрузка на ядра процессора, при использовании этого способа параллелизации, сильно зависела от настроек кодирования видеопотока, использования особенностей стандарта и варьировалась в широких пределах.</p>
<p>Следующий шаг, который был нами предпринят, - параллелизация по слайсам (анг. slice). Слайс – часть сжатого кадра, которая не зависит от остальных слайсов (частей) этого кадра. Это были идеальные предпосылки для внедрения параллелизации. И хотя внутренняя структура декодера была переработана более существенным образом, чем в первом случае, параллелизация по слайсам принесла более впечатляющие результаты. Теперь декодер демонстрировал почти двукратное прибавление в производительности при использовании второго рабочего потока, по сравнению с однопоточной версией. Впрочем, этот способ имел один очень существенный недостаток: не все видеопотоки содержат кадры, состоящие из нескольких слайсов. Соответственно, параллелизация по слайсам была абсолютно бесполезна при декодировании видеопотоков, которые состоят из кадров содержащих только один слайс.</p>
<p>На следующем этапе параллелизации нам пришлось провести декомпозицию процесса декодирования по данным. Это потребовало практически полной переписки декодера, но мы рассчитывали получить впечатляющие результаты. Теперь рабочий поток получал для обработки не целиком слайс, а только одну строчку макроблоков из него. К тому же, поток выполнял не полное декодирование переданной ему строчки, а только часть: декомпрессию данных макроблоков или реконструирование макроблоков, используя ранее декомпрессированые данные. Данные макроблоков декомпрессировались в специальные временные буфера, откуда позже использовались для реконструирования. Процесс деблокинга также был подвергнут процессу декомпозиции по данным. Теперь оба рабочих потока могли выбирать на исполнение любую их 3х задач (декомпрессию, реконструкцию, деблокинг), в зависимости от текущей стадии декодирования кадра. И хотя этот способ оказался непременим при декодировании некоторых видеопотоков, сжатых с использованием особенности slice group стандарта H264, в целом он продемонстрировал отличную производительность. Теперь декодер легко показывал двукратное ускорение при декодировании любых видеопотоков.</p>
<p>На самом деле, я немного слукавил, описывая первые три этапа параллелизации, когда говорил «любые видеопотоки». Я имел ввиду потоки большого разрешения. Больше, чем стандартное телевизионное (SD, 720x576) разрешение. Когда мы попытались протестировать декодер на видеопотоках с маленьким разрешением, мы наткнулись на неприятный сюрприз: не было никаких признаков двукратного роста производительности при использовании второго потока. Максимум, что показывал декодер – было 30ти процентное ускорение, что было полностью неприемлимо для нас. Дальнейшее расследование выявило несколько проблем, которые полностью отсутствовали при декодировании видеопотоков с большим (HD, 1920x1080, 1280x720) разрешением. Решение этих проблем стало залогом к блестяще работающей параллелизации.<br />
Сначала мы избавились от лишних обновлений кэша ядер процессоров. Дело в том, что выполняя реконструирование макроблоков, рабочие потоки использовали временные буфера для хранения промежуточных данных, что вызывало лишние принудительные обновления кэша у второго ядра. Мы переписали функции, выполняющие реконструирование, чтобы они не «портили» данные во временном буфере, а использовали стэк для хранения промежуточных данных. Принудительные обновления кэша ядер исчезли, что положительно сказалось на общей производительности, но конечная скорость работы декодера по-прежнему была неприемлима.</p>
<p>Оказалось, что виновницей низкой производительности декодера была не вполне корректная схема параллелизации. Мы использовали схему, когда синхронизация главного и дополнительного потоков осуществлялась на каждый вызов метода декодера для декодирования очередного кадра (DoDecode). Среди параметров к вызову DoDecode был указатель на сжатый кадр, который «регистрировался» главным потоком внутри декодера. После этого главный поток подавал сигнал внутреннему потоку, что «можно начинать работать», выполнял свою часть декодирования кадра и ждал, пока внутренний поток выполнит свою часть работы, выставит сигнал «внутренний поток закончил свою часть работы» и «заснёт», после чего главный поток выходил из метода DoDecode, возвращая разжатый кадр вызывающему приложению.<br />
<div id="attachment_2001714" class="wp-caption aligncenter" style="width: 510px"><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/scheme0.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/scheme0.png" alt="Первоначальная схема синхронизации" width="500" height="246" class="size-full wp-image-2001714" /></a><p class="wp-caption-text">Первоначальная схема синхронизации</p></div><br />
При декодировании видеопотоков с маленьким разрешением времена старта и ожидания завершения работы внутреннего потока оказались сопоставимы с временем декодирования самого кадра. Чтобы избавиться от этого неприятного эффекта требовалось, чтобы у декодера не было нужды в старте-остановке внутреннего потока.<br />
Для этих целей была разработана схема параллелизации без необходимости синхронизации потоков между собой, которая была позже запатентована.<br />
Главное её отличие от предыдущей было в том, что дополнительный поток не «засыпал» между вызовами.<br />
Дополнительный поток запускался в момент инициализации декодера и непрерывно опрашивал специальный объект (хранилище сжатых и разжатых кадров) на наличие работы. Если работы не было, внутренний поток «засыпал» на очень малое количество времени, после чего опять опрашивал хранилище на наличие работы (сжатых кадров).<br />
Сжатые кадры попадали внутрь хранилища в момент вызова метода DoDecode в главном потоке. Только теперь главный поток не «регистрировал» сжатые данные, а честно их копировал в хранилище. После копирования сжатые данные сразу же становились доступны для внутреннего потока, который незамедлительно приступал к их разжатию. Если количество скопированных сжатых кадров было меньше, чем количество видеопотоков для декодирования, то главный поток тут же возвращается из метода DoDecode со значением «требуются ещё данные». Данная процедура копирования сжатых кадров в хранилище повторялась несколько раз. В итоге, в тот момент, когда в хранилище скапливалось нужное количество сжатых кадров, была большая вероятность, что самый «старый» кадр оказывался уже разжат, и главному потоку оставалось только «доставить» этот кадр пользователю. Если же самый «старый» кадр был ещё не до конца разжат, то главный поток принимал ещё и участие в его декодировании.<br />
<div id="attachment_2001718" class="wp-caption aligncenter" style="width: 510px"><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/scheme1.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/scheme1.png" alt="Конечная схема синхронизации" width="500" height="260" class="size-full wp-image-2001718" /></a><p class="wp-caption-text">Конечная схема синхронизации</p></div><br />
Данная схема параллелизации обеспечила великолепную балансировку нагрузки по потокам и сделала возможным загрузку всех процессоров даже в том случае, когда главный поток находился вне декодера. Ключом к подобным результатам было обеспечение декодирования нескольких кадров в параллель. Именно для этих целей главный поток «доставлял» в хранилище несколько сжатых кадров перед тем, как принять участие в декомпрессии. И если два потока не могли принимать участие в декодировании одного кадра, то один из потоков отправлялся декодировать следующий кадр. Чтобы сделать возможным декодирование зависимых кадров, для каждого из опорных кадров, т.е. тех кадров, информация из которых используется для декодирования других кадров, велась статистика, на сколько кадр декодирован. При декодировании зависимых кадров эта статистика учитывалась, чтобы избежать ситуации, когда вектора движения в зависимом кадре выходят за границу декодированной области в опорном кадре. Наглядно, подобную организацию можно представить в виде «лесенки» (вид сбоку):<br />
<div id="attachment_2001719" class="wp-caption aligncenter" style="width: 510px"><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/scheme2.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/scheme2.png" alt="Зависимая декомпрессия опорных кадров" width="500" height="305" class="size-full wp-image-2001719" /></a><p class="wp-caption-text">Зависимая декомпрессия опорных кадров</p></div><br />
Теперь декодер демонстрировал блестящую производительность и масштабируемость на любых потоках, независимо от их размера и способа сжатия.<br />
Вернёмся к началу. Статья называлась «правильная» параллелизация. Что же тут правильного? Грамотно разработанная схема и способ параллелизации, которая при переносе на новые условия показывает столь же высокие результаты. В частности, конечная схема параллелизации продемонстрировала высокую масштабируемость при работе на 16 процессорах включительно. Такие же результаты были достигнуты при портировании кода декодера на последнюю графическую карту от Intel’а Larrabee. Всё это служит отличным доказательством хорошо реализованной параллелизации, работающей всегда и везде. Правильной параллелизации.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/07/20/2001715/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

