<?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; Графика</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/category/visual-computing/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/ru-ru/blogs</link>
	<description></description>
	<lastBuildDate>Tue, 07 Feb 2012 14:18:00 +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>Развлечения ради: OpenMP для построения фракталов</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/12/30/openmp-4/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/12/30/openmp-4/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 08:44:59 +0000</pubDate>
		<dc:creator>atercattus</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Графика]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[c++ parallel programming]]></category>
		<category><![CDATA[openmp]]></category>
		<category><![CDATA[картинки]]></category>
		<category><![CDATA[фрактал]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/12/30/openmp-4/</guid>
		<description><![CDATA[<p>Данный пост будет первым из, надеюсь, серии небольших очерков о применении различных библиотек распараллеливания вычислений. В качестве прикладной задачи выбрано графическое построение всем хорошо знакомого <a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BD%D0%B4%D0%B5%D0%BB%D1%8C%D0%B1%D1%80%D0%BE%D1%82%D0%B0">множества Мандельброта</a>. В качестве библиотеки реализации вычислений в этот раз возьму OpenMP, а для унификации работы с разными оконными подсистемами - GLUT/OpenGL.</p>]]></description>
			<content:encoded><![CDATA[<p>Данный пост будет первым из, надеюсь, серии небольших очерков о применении различных библиотек распараллеливания вычислений. В качестве прикладной задачи выбрано графическое построение всем хорошо знакомого <a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BD%D0%B4%D0%B5%D0%BB%D1%8C%D0%B1%D1%80%D0%BE%D1%82%D0%B0">множества Мандельброта</a>. В качестве библиотеки реализации вычислений в этот раз возьму OpenMP, а для унификации работы с разными оконными подсистемами - GLUT/OpenGL.</p>
<p><span id="more-2006700"></span></p>
<p>В качестве пиксельной матрицы возьмем массив 32-битных целых, рассматривая его как ARGB-плоскость. 4 байта на тексель не сильно экономят память <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , но избавляют от необходимости следить за выравниваем при заполнении буфера. Альфа-канал использоваться не будет.</p>
<p>После заполнения его каким-либо способом (зависит от библиотеки распараллеливания), загружаем данные в память видеокарты вызовом glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA...), а затем отрисовываем одним блоком GL_QUADS на весь экран (выводим прямоугольник).</p>
<blockquote><p>Вариант с glDrawPixels и так не советуют к использованию, так еще и по результатам эксперимента применение данной функции приводит к падению скорости отрисовки на порядок. Не пойдет. А применение VBO (Vertex Buffer Objects) в данном случае не обосновано - у нас всего 4 вершины и одна текстура.</p>
</blockquote>
<p>На выбор OpenGL+GLUT прежде всего повлияло желание собрать и запустить приложение как под Linux, так и под Windows и сравнить результаты на одинаковом "железе".</p>
<p>Распараллеливание будем выполнять, разделив текстуру на горизонтальные блоки по числу используемых потоков/ядер. В SLI/CrossFire конфигурациях видеокарт используется подобный режим Split Frame/Scissor (изображение взято с <a href="http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Scissor.png">википедии</a>):</p>
<p><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Scissor1.png" alt="" class="alignnone size-thumbnail wp-image-2006709" /></p>
<p>Заменим видеокарты на процессорные ядра - и получим вариант распараллеливания.</p>
<p>Просто выводить множество целиком не столь интересно, как рассматривать его фрагменты в приближении. Для этого сразу введем координаты ограничивающего окна, в пределах которого строится изображение и данные самой текстуры:</p>
<pre name="code" class="cpp">
typedef struct {
    double x1, y1,
           x2, y2;
} Bounds;

typedef unsigned char byte;

typedef struct {
    int  width,     // ширина в пикселях
         height,    // высота в пикселях
         size;      // размер в пикселях == width*height
    byte *buff;     // кусок памяти с пиксельными данными
} Buffer;
</pre>
<p>Само множество на комплексной плоскости находится в пределах (-2,-1) x (1,1), так что можно начать с вывода с запасом (-2,-1.5) x (1,1.5) - вариант квадратной области.</p>
<p>Текстура хранится также квадратная, размерами 2^n (текстуры размерами не кратными степени 2 будут работать далеко не на всех видеокартах). Размер текстуры (T), равно как и предельное число итераций  проверки сходимости (n) выражают общую сложность построения как O(T^2*n).</p>
<p>При распараллеливании каждому из потоков на вход нужно подать ограничивающий объем в координатах комплексной плоскости, а также две V-координаты текстуры (высота/ось Y), обозначающие первую и последнюю строки, в которых следует отобразить результаты.</p>
<p>Сразу картинку возможного вывода:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-12_cut.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-12_cut-300x222.png" alt="" width="300" height="222" class="alignnone size-medium wp-image-2006717" /></a></p>
<p>Итого имеем:</p>
<pre name="code" class="cpp">
// координаты "окна" в комплексной плоскости
Bounds screen;

// текущие координаты центра "окна" в комплексной плоскости
double cX=0, cY=0;

// размер клиентской области окна в системе
int window_width  = 800,
    window_height = 800;

// текущий шаг приближения
int STEP = 0;

// предел числа итераций проверки сходимости
int ITERS = MIN_ITERS;
</pre>
<p>Собственно рендер фрактала в текстуру выполняется обычным распараллеленым циклом:</p>
<pre name="code" class="cpp">
void fractal() {
    int parts = omp_get_max_threads();
    if ( parts &lt;= 0 ) parts = 1;

    omp_set_dynamic( 0 );
    omp_set_num_threads( parts );

    int p, y=0, dy;
    double sy = (screen.y2-screen.y1) / parts;
    dy = buffer.height / parts;

    #pragma omp parallel for firstprivate(y) ordered
    for ( p=0; p&lt;parts; ++p ) {
        Bounds bounds;
        bounds.x1 = screen.x1;
        bounds.x2 = screen.x2;

        bounds.y1 = screen.y1 + p*sy;
        bounds.y2 = bounds.y1 + sy;

        y = p*dy;

        //fractal_block( bounds, y, y+dy-1, (p+1)*6 );
        fractal_block( bounds, y, y+dy-1, 3 );
    }
}
</pre>
<p>Т.к. координата верхней строки каждого блока (y) используется внутри тела цикла, при этом меняясь, то ее следует передавать через firstprivate.</p>
<p>Функция fractal_block принимает координаты окна комплексной плоскости (bounds), верхнюю и нижнюю границы в текстуре (y, y+dy-1) и множитель "яркости" (о нем ниже):</p>
<pre name="code" class="cpp">
void fractal_block( Bounds block, int y1, int y2, int f ) {
    int *ptr = (int*)( buffer.buff + y1*buffer.width*4 );

    double x, y, sx, sy, z, zi;

    x = block.x1;
    y = block.y1;
    // приращения по комплексным осям между соседними текселями текстуры
    sx = (block.x2 - block.x1) / buffer.width;
    sy = (block.y2 - block.y1) / (y2-y1+1);

    int width = buffer.width;

    // раскидываю значение множителя по трем младшим байтам
    f = f%256;
    f = (f&lt;&lt;16) | (f&lt;&lt;8) | f;

    for ( ; y1&lt;=y2; ++y1 ) {
        int _x;
        for ( _x=0; _x&lt;width; ++_x ) {
            z = zi = 0.0;
            int steps = 0;
            for ( ; steps&lt;ITERS; ++steps ) {
                double tmp = (z*z) - (zi*zi) + x;
                zi = 2*z*zi + y;
                z = tmp;

                if ( z*z + zi*zi &gt; 4.0 ) break;
            }

            *ptr++ = f * steps2RGBA( steps&lt;ITERS ? steps : 0 );

            x += sx;
        }

        y += sy;
        x  = block.x1;
    }
}
</pre>
<p>Что же дает "множитель яркости" f? Благодаря ему можно визуально разделять блоки, которые рассчитывались разными ядрами. Достаточно использовать при генерации значение, зависящее от номера текущего блока/ядра, например так: <b>fractal_block( bounds, y, y+dy-1, (p+1)*6 );</b></p>
<p>При этом будет наблюдаться картина вроде такой:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-10_cut.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-10_cut-e1325188428659-300x221.png" alt="" width="300" height="221" class="alignnone size-medium wp-image-2006721" /></a></p>
<p>Хорошо заметны 5 блоков, из которых состыкована текстура.</p>
<p>Технические подробности инициализации GLUT, OpenGL, рендеринга текстуры, масштабирования вокруг точки, подстройки предела проверки сходимости оставлю за кадром. Это все есть в прилагаемом исходнике для желающих.</p>
<p>Реализация выполнена с подстройкой предела сходимости с целью снять ненужную нагрузку (на общем плане что 50 итераций, что 100 - визуально не заметно, а нагрузка ощущается). Соотвественно идет подстройка предела при масштабировании (также ее можно менять кнопками Up/Down). </p>
<p>Непосредственно по распараллеливанию. На машине с Core i5 750 в 2 потока отрисовка дает честный двухкратный прирост, на 4х потоках прирост порядка 3.5 раз. На приближении 2^40 и пределе итераций в 250 время работы 4х ядер 1.01сек против 3.64сек на одном. <i>Была бы машина с иксами с большим числом ядер - было бы конечно интересней. Не раз встречал мнение, что распараллеливание особо проявляется не менее, чем на 8ми ядрах. Если у кого есть возможность и желание - запустите, интересен коэффициент прироста скорости в сравнении с одним и двумя ядрами.</i></p>
<p>Приближение 2^40 выбрано с целью предотвращения величин ошибок округления, влияющих на результат. Примерно на 42-43 итерации приближения размер окна в комплексной плоскости становится менее 6.82e-13 и начинают проявляться ошибки округления (underflow):</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/fractal_underflow_cut.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/fractal_underflow_cut-e1325190159240-300x213.png" alt="" width="300" height="213" class="alignnone size-medium wp-image-2006725" /></a></p>
<p>В итоге получаем достаточно неплохой результат ценой практически одной только строчки pragma <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>На очереди ArBB, TBB и что еще подвернется.</p>
<p>И еще немного картинок:</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot_cut.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot_cut-300x222.png" alt="" width="300" height="222" class="alignnone size-medium wp-image-2006727" /></a> <a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-15_cut.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-15_cut-300x222.png" alt="" width="300" height="222" class="alignnone size-medium wp-image-2006728" /></a> <a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-1_cut.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-1_cut-300x300.png" alt="" width="300" height="300" class="alignnone size-medium wp-image-2006731" /></a> <a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-14_cut.png"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Screenshot-14_cut-300x222.png" alt="" width="300" height="222" class="alignnone size-medium wp-image-2006729" /></a></p>
<p><a href='http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/fractal_isn.tar.gz'>Исходники (tar.gz)</a></p>
<p><b>И всех с Наступающим!</b></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/12/30/openmp-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Непростая арифметика: декодирование</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/12/27/2006586/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/12/27/2006586/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 08:11:53 +0000</pubDate>
		<dc:creator>Dmitry Serkin (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Графика]]></category>
		<category><![CDATA[arithmetic coding]]></category>
		<category><![CDATA[entropy coding]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/12/27/2006586/</guid>
		<description><![CDATA[Небольшая заметка-продолжение темы арифметического кодирования, на сей раз речь пойдет о декодировании.]]></description>
			<content:encoded><![CDATA[<p>Небольшая заметка-продолжение темы арифметического кодирования. Но на сей раз речь пойдет о декодировании. <a href="http://software.intel.com/ru-ru/blogs/2011/12/20/2006336/">Вспомним</a>, что с помощью техники вложенных интервалов мы получили некоторый код, который однозначно определяет всю входную последовательность. Декодирование же восстанавливает оригинальные символы, тем самым образуя множество элементов:</p>
<div style="text-align:center;padding: 5 5 5 5">
<img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/114.png" />
</div>
<p>Процесс декодирования восстанавливает последовательность в том же порядке в каком она кодировалась. Определим множество нормализованных кодов (нормализация на целый интервал):</p>
<div style="text-align:center;padding: 5 5 5 5">
<img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/211.png" />
</div>
<p>Естественно предположить, что рекурсия, применяемая для кодирования, действует и в обратную сторону. Начиная с исходного кода алгоритм шаг за шагом находит закодированный символ:</p>
<div style="text-align:center;padding: 5 5 5 5">
<img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/310.png" />
</div>
<p>Если до этого момента понятно так и не стало, то нас спасет только пример. <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Следуя примеру из <a href="http://software.intel.com/ru-ru/blogs/2011/12/20/2006336/">предыдущей заметки</a>, входная последовательность символов: a2a1a0a0a1a3. Распределение вероятностей: p = [0.2, 0.5, 0.2, 0.1]. Код: 0.74267578125.</p>
<div style="text-align:center;padding: 5 5 5 5">
<img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/48.png" />
</div>
<p>В таком ключе находим все 6 символов. Но так как мы работаем с интервалами действительных чисел, то есть риск не закончить эту работу никогда. Поэтому для завершения декодеру необходимо знать либо количество символов, либо иметь некоторый маркер конца.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/12/27/2006586/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Движемся к началу: MTF (Move To Front) в помощь энтропийному кодированию</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/12/26/mtf-move-to-front/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/12/26/mtf-move-to-front/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 12:59:16 +0000</pubDate>
		<dc:creator>atercattus</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Графика]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[decoding]]></category>
		<category><![CDATA[move-to-front]]></category>
		<category><![CDATA[mtf]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/12/26/mtf-move-to-front/</guid>
		<description><![CDATA[<p>Решил написать небольшую статейку в дополнение к серии статей <a href="http://software.intel.com/ru-ru/blogs/author/dmitry-serkin/">Dmitry Serkin</a> по сжатию (в частности изображений).</p>

<p>Как-то все непосредственно само сжатие, да итоговое досжатие тем же арифметическим кодером.</p>

<p>Здесь же решил описать опциональную стадию предобработки сжатых основными шагами конвейера бинарных данных, но до подачи их энтропийному кодеру (ЭК).</p>]]></description>
			<content:encoded><![CDATA[<p>Решил написать небольшую статейку в дополнение к серии статей <a href="http://software.intel.com/ru-ru/blogs/author/dmitry-serkin/">Dmitry Serkin</a> по сжатию (в частности изображений).</p>
<p>Как-то все непосредственно само сжатие, да итоговое досжатие тем же арифметическим кодером.</p>
<p>Здесь же решил описать опциональную стадию предобработки сжатых основными шагами конвейера бинарных данных, но до подачи их энтропийному кодеру (ЭК).</p>
<p>Что лучше сожмет ЭК? Конечно можно подать на вход 100500 нулей, но с такой вырожденной задачей отлично справится RLE. Тут важна предсказуемость и монотонность данных в потоке: было бы хорошо, если бы одинаковые значения (байт, бит) шли последовательно.</p>
<p>Можно рассматривать два наиболее популярных алгоритма: BWT и MTF.</p>
<p><i>В этот раз напишу про второй, т.к. первый (Burrows–Wheeler transform, преобразование Барроуза-Уиллера) прекрасно описан на Википедии, и смысла рассказывать тоже самое своими словами мало. Но если только кому-то будет интересно... <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </i></p>
<p>Итак, MTF (Move-To-Front, Движение к началу, Стопка книг, Сортировка стопки книг) является обратимым преобразованием над сжимаемым потоком, выполняемым с целью улучшения результатов последующего ЭК.</p>
<p>Алгоритм работает над блоками байт (машинных слов, etc), подменяя их соответствующими позициями в некотором словаре. При этом при обработке каждого символа словарь модифицируется, что приводит к выдаче различных позиций для одного и того же символа в процессе работы алгоритма.</p>
<p>Первоначально словарь заполняется всеми возможными значениями обрабатываемого блока (потока). Это заполнение идентично выполняется и на стороне архиватора, так и на стороне распаковщика.</p>
<p>Кодирование заключается в последовательном обходе всех символов входной последовательности. Символ ищется в словаре, а в выходной поток записывается его <u>текущая</u> позиция. После этого символ удаляется из своей позиции в словаре (сдвиг вправо значений словаря с 0 до позиции символа-1), и вставляется в начало словаря (присвоение нулевому элементу).</p>
<p>Для примера возьмем блок "20112012" и словарь из цифр "0".."9". Если сразу сжимать RLE, то будет найдено только "11" и ничего хорошего не выйдет. Если сжимать, Хаффманом или PPM с окном на все 8 байт, то будет найдено слово "201", что уже хорошо.</p>
<p>А теперь попробуем сначала преобразовать по MTF:</p>
<table border="1"  style="border:1px solid #888;cellpadding: 5">
<tr>
<th>Шаг</th>
<th>Вход</th>
<th>Выход</th>
<th>Словарь</th>
</tr>
<tr>
<td style="padding: 2px;">0</td>
<td style="padding: 2px;"><u>2</u>0112012</td>
<td style="padding: 2px;"><i>Пустой список</i></td>
<td style="padding: 2px;">0123456789</td>
</tr>
<tr>
<td style="padding: 2px;">1</td>
<td style="padding: 2px;"><u>2</u>0112012</td>
<td style="padding: 2px;">2</td>
<td style="padding: 2px;">2013456789</td>
</tr>
<tr>
<td style="padding: 2px;">2</td>
<td style="padding: 2px;">2<u>0</u>112012</td>
<td style="padding: 2px;">2,1</td>
<td style="padding: 2px;">0213456789</td>
</tr>
<tr>
<td style="padding: 2px;">3</td>
<td style="padding: 2px;">20<u>1</u>12012</td>
<td style="padding: 2px;">2,1,2</td>
<td style="padding: 2px;">1023456789</td>
</tr>
<tr>
<td style="padding: 2px;">4</td>
<td style="padding: 2px;">201<u>1</u>2012</td>
<td style="padding: 2px;">2,1,2,0</td>
<td style="padding: 2px;">1023456789</td>
</tr>
<tr>
<td style="padding: 2px;">5</td>
<td style="padding: 2px;">2011<u>2</u>012</td>
<td style="padding: 2px;">2,1,2,0,2</td>
<td style="padding: 2px;">2103456789</td>
</tr>
<tr>
<td style="padding: 2px;">6</td>
<td style="padding: 2px;">20112<u>0</u>12</td>
<td style="padding: 2px;">2,1,2,0,2,2</td>
<td style="padding: 2px;">0213456789</td>
</tr>
<tr>
<td style="padding: 2px;">7</td>
<td style="padding: 2px;">201120<u>1</u>2</td>
<td style="padding: 2px;">2,1,2,0,2,2,2</td>
<td style="padding: 2px;">1023456789</td>
</tr>
<tr>
<td style="padding: 2px;">8</td>
<td style="padding: 2px;">2011201<u>2</u></td>
<td style="padding: 2px;">2,1,2,0,2,2,2,2</td>
<td style="padding: 2px;">2103456789</td>
</tr>
</table>
<p>И по шагам:</p>
<ol start="0">
<li>Во входном буфере смотрим на первый символ, результирующий список позиций пуст, словарь с исходном виде;</li>
<li>Текущий символ "2" имеет позицию 2 в словаре. Добавляем 2 в результат, а "2" в словаре переносим в начало, получая "20134...";</li>
<li>Следущий символ "0" имеет позицию 1 в текущем словаре. Добавляем 1 в результат, а "0" в словаре переносим в начало, получая "02134..."</li>
<li>Аналогично повторяем для всего блока;</li>
<li>В результате получаем последовательность позиций символов в меняющемся словаре.</li>
</ol>
<p>В итоге получаем последовательность "21202222". Которая в некоторых случаях будет сжата компактнее исходного варианта <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>Однако толку мало, если обратно раскодировать нельзя. А делается это просто: выполняем все в обратную сторону (но с исходным словарем):</p>
<table border="1" style="border:1px solid #888;border-collapse:collapse">
<tr>
<th>Шаг</th>
<th>Вход</th>
<th>Выход</th>
<th>Словарь</th>
</tr>
<tr>
<td style="padding: 2px;">0</td>
<td style="padding: 2px;"><u>2</u>1202222</td>
<td style="padding: 2px;"><i>Пусто</i></td>
<td style="padding: 2px;">0123456789</td>
</tr>
<tr>
<td style="padding: 2px;">1</td>
<td style="padding: 2px;"><u>2</u>1202222</td>
<td style="padding: 2px;">2</td>
<td style="padding: 2px;">2013456789</td>
</tr>
<tr>
<td style="padding: 2px;">2</td>
<td style="padding: 2px;">2<u>1</u>202222</td>
<td style="padding: 2px;">2,0</td>
<td style="padding: 2px;">0213456789</td>
</tr>
<tr>
<td style="padding: 2px;">3</td>
<td style="padding: 2px;">21<u>2</u>02222</td>
<td style="padding: 2px;">2,0,1</td>
<td style="padding: 2px;">1023456789</td>
</tr>
<tr>
<td style="padding: 2px;">4</td>
<td style="padding: 2px;">212<u>0</u>2222</td>
<td style="padding: 2px;">2,0,1,1</td>
<td style="padding: 2px;">1023456789</td>
</tr>
<tr>
<td style="padding: 2px;">5</td>
<td style="padding: 2px;">2120<u>2</u>222</td>
<td style="padding: 2px;">2,0,1,1,2</td>
<td style="padding: 2px;">2103456789</td>
</tr>
<tr>
<td style="padding: 2px;">6</td>
<td style="padding: 2px;">21202<u>2</u>22</td>
<td style="padding: 2px;">2,0,1,1,2,0</td>
<td style="padding: 2px;">0213456789</td>
</tr>
<tr>
<td style="padding: 2px;">7</td>
<td style="padding: 2px;">212022<u>2</u>2</td>
<td style="padding: 2px;">2,0,1,1,2,0,1</td>
<td style="padding: 2px;">1023456789</td>
</tr>
<tr>
<td style="padding: 2px;">8</td>
<td style="padding: 2px;">2120222<u>2</u></td>
<td style="padding: 2px;">2,0,1,1,2,0,1,2</td>
<td style="padding: 2px;">2103456789</td>
</tr>
</table>
<p>
И по шагам:</p>
<ol start="0">
<li>Во входном буфере смотрим на первый символ (позицию в словаре), результирующий список позиций пуст, словарь с исходном виде;</li>
<li>Текущий символ 2, а по позиции 2 в словаре символ "2". Добавляем "2" в результат, а "2" в словаре переносим в начало, получая "20134...";</li>
<li>Следущий символ 1, с этой позицией у нас символ "0". Добавляем "0" в результат, а "0" в словаре переносим в начало, получая "02134..."</li>
<li>Аналогично повторяем для всего блока;</li>
<li>В результате получаем исходную строку байт "20112012".</li>
</ol>
<p>Как можно заметить, итоговый словарь совпадает в обоих случаях.</p>
<p>Пример реализации на Python:</p>
<pre name="code" class="python">
#!/usr/bin/env python
#-*- coding: utf8 -*-

# создаем исходный словарь
DICT = [chr(i) for i in range(ord('0'),ord('9')+1)]

src = '20112012'

def encode(s,d):
    seq = []
    for c in s:
        i = d.index(c)
        seq.append(i)
        d.pop(i)
        d.insert(0,c)
    return seq

def decode(seq,d):
    s = []
    for i in seq:
        c = d[i]
        s.append(c)
        d.pop(i)
        d.insert(0,c)
    return ''.join(s)

print 'SOURCE:  ', src

enc=encode( src, DICT[:] )  # передаем копию словаря
print 'ENCODED: ', enc

dec=decode(enc,DICT[:])  # передаем копию словаря
print 'DECODED: ', dec
</pre>
<p>Стоит заметить, что битовые длины значений выходной последовательности не превышают длины значений во входном потоке (т.к. позиции не превышают размер словаря, который содержит все возможные значения в потоке).</p>
<p>Это позволяет сохранять результирующую последовательность индексов в туже область памяти, откуда читаются входные данные.</p>
<p>Само собой, если нет требования к сохранению исходных данных.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/12/26/mtf-move-to-front/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L.A. Noire: когда квест встретил шутер</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/12/23/la-noire/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/12/23/la-noire/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 07:10:09 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Графика]]></category>
		<category><![CDATA[Игры]]></category>
		<category><![CDATA[GTA]]></category>
		<category><![CDATA[L.A. Noire]]></category>
		<category><![CDATA[Rockstar games]]></category>
		<category><![CDATA[Team Bondi]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/12/23/la-noire/</guid>
		<description><![CDATA[Давным-давно, когда компьютеры были большими и довольно слабенькими, большой популярностью пользовался игровой жанр под названием «квест». Графика на PC до поры оставляла желать лучшего, а квесты - с их огромным простором для домысливания и вообще применения головного мозга по прямому назначению - позволяли и удовольствие от игры получить, и забыть о весьма условной картинке. Когда же графика рванула вперед, квесты остались в прошлом. Просто потому, что желание думать у широких масс куда-то улетучилось. Нет, ну правда – кому охота сидеть и ломать голову, как из шляпы, утюга и вантуза сделать летательный аппарат, когда можно бегать и стрелять, иногда отвлекаясь на любование действительно роскошными пейзажами?]]></description>
			<content:encoded><![CDATA[<p>Давным-давно, когда компьютеры были большими и довольно слабенькими, большой популярностью пользовался игровой жанр под названием «квест». Графика на PC до поры оставляла желать лучшего, а квесты - с их огромным простором для домысливания и вообще применения головного мозга по прямому назначению - позволяли и удовольствие от игры получить, и забыть о весьма условной картинке. Когда же графика рванула вперед, квесты остались в прошлом. Просто потому, что желание думать у широких масс куда-то улетучилось. Нет, ну правда – кому охота сидеть и ломать голову, как из шляпы, утюга и вантуза сделать летательный аппарат, когда можно бегать и стрелять, иногда отвлекаясь на любование действительно роскошными пейзажами?</p>
<p>Каюсь, я и сам постепенно переключился с квестов на шутеры, а в последнее время прохожу от и до только сериалы FarCry/Crysis и GTA. «Раньше у нас было время, теперь у нас есть дела», как пел классик. Ну и жизнь порой подкидывала такие квесты, что компьютерные аналоги как-то перестали цеплять. Последним прошел, кажется, «Грим Фанданго» - и все, отрезало.</p>
<p>Делать квесты практически перестали. Затраты на них внушительные, нужны талантливые сценаристы, толпы актеров, художников и т.д., иначе будет не красиво и не интересно. А купит все это от силы сотня тысяч слоупоков. Кому ж охота несколько лет ваять эксклюзив, который никогда не окупится? </p>
<p><img src="http://helpix.ru/pic/vilianov/lanoire/lanoire05.jpg" alt="L.A. Noire" /></p>
<p>Но в Rockstar Games решили немного воскресить старый жанр. Еще в далеком 2004-м году они поддержали материально австралийскую компанию Team Bondi и приступили к совместной разработке полицейского триллера о Лос-Анджелесе конца сороковых. Чтобы с беготней по улицам, ездой на машинах, стрельбой – но и реальным участием геймера в расследовании преступлений. Для этого на лицах персонажей появилась почти естественная мимика, по которой можно определить – врет ли он, нервничает или, наоборот, рубит правду-матку от души. Планировалось, что игра выйдет в 2008 году, но тут некстати подкрался мировой финансовый кризис, и L.A. Noire отложили до лучших времен. Которые наступили только в мае сего года для приставочников и в ноябре для нас, обладателей настоящих компьютеров. Выход Windows-версии пришелся на не самый лучший период в жизни Team Bondi: в октябре компания обанкротилась, оставив кредиторам разного рода расписок на миллион с лишним долларов США. К счастью, повлиять это может разве что на выход сиквела, если таковой вдруг случится, а оригинальная игра к тому моменту была закончена полностью.</p>
<p><img src="http://helpix.ru/pic/vilianov/lanoire/lanoire04.jpg" alt="L.A.Noire" /></p>
<p>Итак, что такое L.A. Noire?</p>
<p>Во-первых, это GTA IV с сильно улучшенной графикой, действие которой происходит на улицах Лос-Анджелеса образца 1947 года. Ездят машины, ходят люди, дома и улицы очень похожи на настоящие – в общем, залюбуешься. Вот только машины угонять теперь не надо, у полицейского всегда есть своя. И давить людей не рекомендуется, за это жестоко штрафуют и заставляют переигрывать эпизоды. Стрелять можно, но только в конченных негодяев, а так – только в воздух. </p>
<p><img src="http://helpix.ru/pic/vilianov/lanoire/lanoire02.jpg" alt="" /></p>
<p>Вместо веселых кровожадных развлечений мы получаем "во-вторых", а именно квестовую составляющую. На месте преступлений надо искать и изучать улики, вспомнив навыки пиксель-хантинга. Подозреваемых и свидетелей надо опрашивать, постоянно догадываясь – врут они, недоговаривают что-то или говорят правду. Если не угадаешь, пропустишь ценную информацию, или собеседник замкнется в себе и прервет беседу. Наградой за успешно разгаданную головоломку становится ролик с флэшбеком главного героя, прошедшего вторую мировую войну, или просто забавный разговор между персонажами.</p>
<p>Я бывал в Лос-Анджелесе, но не могу сказать, что опознал в игре хоть кусочек города, не считая нескольких знаковых зданий. Наверное, за пятьдесят с лишним лет в нем действительно изменилось немало. Но нарисовано все удивительно симпатично, саундтрек идеально дополняет картинку, а диалоги, как это всегда бывает у Rockstar, радуют слух. Конечно, в них чуть не хватает мрачных и одновременно пошлых шуток из оригинальной GTA, ну да ничего, ее у нас никто не отнимал (как раз недавно еще разок прошел четвертую часть и жду пятую).</p>
<p><img src="http://helpix.ru/pic/vilianov/lanoire/lanoire03.jpg" alt="" /></p>
<p>Преступления в L.A. Noire приходится расследовать самые разные – от угона автомобиля у аргентинского посла, оказавшегося… не очень хорошим человеком, до негодяйств серийного убийцы. Приятно, что тебе не дают притомиться от однообразия. Едешь с локации на локацию, а тут тебе подбрасывают какую-то мелочевку, вроде кражи в магазине. Несешься, разбираешься, а потом уже снова занимаешься серьезным делом.</p>
<p>Системные требования у игры приемлемые. На Radeon 6850 она неплохо работает при разрешении 1600х1200 при почти максимальных графических настройках, и только со сглаживанием лучше не перебарщивать. На опробованной недавно GeForce 560Ti (ультратихой, производства Palit) все совсем хорошо. И теперь главное, ради чего, собственно, этот пост и написан <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  С поддержкой многоядерности у L.A.Noire порядок: два ядра процессора нагружены постоянно, а остальные – в зависимости от сложности сцены. Конечно, хотелось бы перетащить на CPU еще больше, чтобы GPU грелся поменьше, но это, пожалуй, уже из области капризов.</p>
<p><img src="http://helpix.ru/pic/vilianov/lanoire/lanoire01.jpg" alt="" /></p>
<p>Так что очень толковая получилась игра (продано уже больше 4 миллионов копий), и если на новогодних праздниках у вас будет свободное время – очень рекомендую. Можно смело брать и локализованную версию, потому что переозвучивать прекрасные диалоги никто не стал, а просто пустили снизу субтитры. Идеальный вариант.</p>
<p>На сим закругляюсь. Надо уже наказать этого неуловимого маньяка…</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/12/23/la-noire/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Нейронная сеть Хопфилда или напиши сам FineReader</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/12/22/finereader-2/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/12/22/finereader-2/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 08:11:49 +0000</pubDate>
		<dc:creator>smel</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Графика]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[математика]]></category>
		<category><![CDATA[Нейронные сети]]></category>
		<category><![CDATA[С++]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/12/22/finereader-2/</guid>
		<description><![CDATA[Статья посвящена введению в нейронные сети и примеру их
реализации. В первой части дано небольшое теоретическое введение в нейронные сети
на примере нейронной сети Хопфилда. Показано, как осуществляется обучение сети и
как описывается ее динамика. Теоретически показана способность нейронной сети Хопфилда
очищать от шума заранее обученный ключевой образ. Во второй части показано, как
можно реализовать алгоритмы, описанные в первой части при помощи языка С++. Разработанная
программа наглядно показывает способность нейронной сети очищать от шума ключевой
образ. В конце статьи есть ссылка на исходный код проекта]]></description>
			<content:encoded><![CDATA[<blockquote><p>Статья посвящена введению в нейронные сети и примеру их<br />
реализации. В первой части дано небольшое теоретическое введение в нейронные сети<br />
на примере нейронной сети Хопфилда. Показано, как осуществляется обучение сети и<br />
как описывается ее динамика. Теоретически показана способность нейронной сети Хопфилда<br />
очищать от шума заранее обученный ключевой образ. Во второй части показано, как<br />
можно реализовать алгоритмы, описанные в первой части при помощи языка С++. Разработанная<br />
программа наглядно показывает способность нейронной сети очищать от шума ключевой<br />
образ. В конце статьи есть ссылка на исходный код проекта.</p></blockquote>
<h1>Теоретическое введение</h1>
<h2>Введение</h2>
<p>    Для начала, необходимо определить, что такое нейрон. В<br />
биологии нейрон - специализированная клетка, из которой состоит нервная система. Биологический нейрон имеет строение, показанное на рис.1.</p>
<p><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/neiron_internet.jpg" alt="Схема нейрона" width="572" height="300" class="aligncenter size-medium wp-image-2006398" /><br />
<em>
<p>Рис.1 Схема нейрона</p>
<p></em></p>
<p>Нейронную сеть можно ввести как совокупность нейронов и их взаимосвязей. Следовательно, для того, чтобы определить искусственную (не биологическую) нейронную сеть необходимо:</p>
<ul>
<li>Задать архитектуру сети;</li>
<li>Определить динамику отдельных элементов сети - нейронов;</li>
<li>Определить правила, по которым нейроны будут взаимодействовать между собой;</li>
<li>Описать алгоритм обучения, т.е. формирования связей для решения поставленной задачи.</li>
</ul>
<p>В качестве архитектуры нейронной сети будет использоваться сеть Хопфилда. Данная модель, видимо, является наиболее распространенной математической моделью в нейронауке. Это обусловлено ее простотой и наглядность. Сеть Хопфилда показывает, каким образом может быть организована память в сети из элементов, которые не являются очень надежными. Экспериментальные данные показывают, что при увеличении количества вышедших из строя нейронов до 50%, вероятность правильного ответа крайне близка к 100%. Даже поверхностное сопоставление нейронной сети (например, мозга) и Фон-Неймановской ЭВМ показывает, насколько сильно различаются эти объекты: к примеру, частота изменения состояний нейронов ("тактовая частота") не превышает 200Гц, тогда как частота изменения состояния элементов современного процессора может достигать нескольких ГГц (10<sup>9</sup>Гц).</p>
<h2>Формальное описание сети Хопфилда</h2>
<p>    Сеть состоит из N искусственных нейронов, аксон каждого нейрона связан с дендритами остальных нейронов, образуя обратную связь. Архитектура сети изображена на рис. 2.</p>
<p><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/Hopfields_net.png" /><br />
<em>
<p>Рис.2 Архитектура нейронной сети Хопфилда</p>
<p></em></p>
<p>Каждый нейрон может находиться в одном из 2-х состояний:</p>
<table width="750">
<tr>
<td width="25%"></td>
<td width="65%"><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image004.png" /></td>
<td>(1)</td>
</tr>
</table>
<p>где <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image006.png" /> - состояние нейрона в момент <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image008.png" />. "Возбуждению" нейрона соответствует <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image010.png" />, а "торможению" <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image012.png" />. Дискретность состояний нейрона отражает нелинейный, пороговый характер его функционирования и известный в нейрофизиологи как принцип "все или ничего".</p>
<p>    Динамика состояния во времени <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image014.png" alt="i" />-ого нейрона в сети из <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image016.png" alt="N" /> нейронов описывается дискретной динамической системой:</p>
<table width="750">
<tr>
<td width="25%"></td>
<td width="65%"><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image018.png" alt="математика" /></td>
<td>(2)</td>
</tr>
</table>
<p>где <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image020.png" alt="Jij" /> - матрица весовых коэффициентов, описывающих взаимодействие дендритов <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image014.png" alt="i" />-ого нейрона с аксонами <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image023.png" alt="j" />-ого нейрона.</p>
<p>    Стоит отметить, что <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image025.png" alt="Jii=0" /> и случай <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image027.png" alt="Summ(...)=0" /> не рассматривается.</p>
<h2>Обучение и устойчивость к шуму</h2>
<p>    Обучение сети Хопфилда выходным образам <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image029.png" alt="xi^in" /> сводится к вычислению значений элементов матрицы <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image020.png" alt="Jij" />. Формально можно описать процесс обучения следующим образом: пусть необходимо обучить нейронную сеть распознавать <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image032.png" alt="M" /> образов, обозначенных <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image034.png" alt="xi^{mu}{in}" />. Входной образ <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image036.png" alt="~xi{in}" /> представляет собой: <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image038.png" alt="" /> где <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image040.png" alt="xi" /> - шум, наложенный на исходный образ. Фактически, обучение нейронной сети - определение нормы в пространстве образов <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image042.png" alt="norma" />. Тогда, очистка входного образа от шума можно описать как минимизацию выражения <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image044.png" alt="norma2" /></p>
<p>    Важной характеристикой нейронной сети является отношение числа ключевых образов <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image032.png" alt="M" />, которые могут быть запомнены, к числу нейронов сети <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image016.png" alt="N" />: <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image048.png" alt="alpha" />. Для сети Хопфилда значение <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image048.png" alt="alpha" /> не больше 0.14.</p>
<p>    Вычисление квадратной матрицы <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image020.png" alt="Jij" /> размера <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image053.png" alt="NxN" /> для <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image032.png" alt="M" /> ключевых образов производится по правилу Хебба:</p>
<table width="750">
<tr>
<td width="25%"></td>
<td width="65%"><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image056.png" alt="Правило Хебба" /></td>
<td>(3)</td>
</tr>
</table>
<p>где <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image058.png" alt="xi{in}" /> означает <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image014.png" alt="i" />-ый элемент образа <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image029.png" alt="xi^in" /></p>
<p>    Стоит отметить, что в силу коммутативности операции умножения, соблюдается равенство</p>
<table width="750">
<tr>
<td width="25%"></td>
<td width="65%"><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image062.png" alt="Jij=Jji" /></td>
<td>(4)</td>
</tr>
</table>
<p>    Входной образ, который предъявляется для распознавания соответствует начальным данным для системы, служащий начальным условием для динамической системы (2): </p>
<table width="750">
<tr>
<td width="25%"></td>
<td width="65%"><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image064.png" alt="Начальное условие" /></td>
<td>(5)</td>
</tr>
</table>
<p>    Уравнений (1), (2), (3), (5) достаточно для определения искусственной нейронной сети Хопфилда и можно перейти к ее реализации.</p>
<h1>Реализация нейронной сети Хопфилда</h1>
<p>Реализация нейронной сети Хопфилда, определенной выше будет производиться на языке C++. Для начала, необходимо определить дополнительные типы данных (подробнее см. листинг 1)</p>
<ul>
<li>тип весовых коэффициентов (выбран тип float);</li>
<li>тип, описывающий состояние нейрона (выбран собственный введеный тип-перечисление);</li>
<li>тип, описывающий состояние сети в момент t (выбран стандартный контейнер vector);</li>
<li>тип, описывающий матрицу весовых коэффициентов связей нейронов (выбран контейнер vector контейнеров vector).</li>
</ul>
<p><em>Листинг 1. Определение новых типов</em></p>
<pre name="code" class="cpp">enum neuron_state {LOWER_STATE=-1, UPPER_STATE=1};
typedef float koef_t;
typedef vector&lt;neuron_state&gt; neurons_line;
typedef vector&lt;vector&lt;koef_t&gt;&gt; link_koefs;
</pre>
<p>Обучение сети, или, точнее, вычисление элементов матрицы <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image062.png" alt="Jij=Jji" /> в соответствии с (3) производится функцией <b>LearnNeuroNet</b>, принимающей на вход список обучающих образов и возвращающей объект типа <b>link_koefs_t</b>. Значения <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image062.png" alt="Jij=Jji" /> вычисляются только для нижнетреугольный элементов. Значения верхнетреугольных элементов вычисляются в соответствии с выражением (4). Общий вид метода <b>LearnNeuroNet</b> показан в листинге 2.</p>
<p><em>Листинг 2. Обучение нейронной сети</em></p>
<pre name="code" class="cpp">
link_koefs LearnNeuroNet(const list &amp;src_images) {
	link_koefs result_koefs;
	size_t neurons_count = src_images.front().size();

	result_koefs.resize(neurons_count);
	for (size_t i = 0; i &lt; neurons_count; ++i) {
		result_koefs[i].resize(neurons_count, 0);
	}

	for (size_t i = 0; i &lt; neurons_count; ++i) {
		for (size_t j = 0; j &lt; i ; ++j ) {
			koef_t val = 0;
			val = std::accumulate(begin(src_images), end(src_images), koef_t(0.0), [i, j] (koef_t old_val, const neurons_line &amp;image) -&gt; koef_t{
				return old_val + (image[i] * image[j]);
			});
			result_koefs[i][j] = val;
			result_koefs[j][i] = val;
		}
	}

	return result_koefs;
}
</pre>
<p>Обновление состояний нейронов реализовано с помощью функтора <b>neuro_net_system</b>. В перегруженный оператор <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image069.png" alt="()" /> функтора передается начальное состояние функтора передается начальное состояние <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image071.png" alt="S(0)" /> , являющееся входным распознаваемых образом (в соответствии с (5)) - указатель на объект типа <b>neurons_line</b>.</p>
<p>Оператор <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image069.png" alt="()" /> функтора модифицирует передаваемый объект типа <b>neurons_line</b> до состояния нейронной сети в момент времени <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image074.png" alt="T" />. Значение <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image074.png" alt="T" /> жестко не фиксировано и определяется выражением:</p>
<table width="750">
<tr>
<td width="25%"></td>
<td width="60%"><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image077.png" alt="T condition" /></td>
<td>(6)</td>
</tr>
</table>
<p>т.е., когда состояние каждого нейрона не изменилось за 1 "такт".</p>
<p>Для вычисления (2) применены 2 алгоритма STL:</p>
<ul>
<li><b>inner_product</b> для вычисления суммы произведений весовых коэффициентов и состояний нейронов (т.е. вычисление (2) для определенного <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image014.png" alt="i" />);</li>
<li><b>transform</b> для вычисления новых значений для каждого нейрона (т.е. вычисление пункта выше для каждого возможного <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/image014.png" alt="i" />)</li>
</ul>
<p>Исходный код функтора <b>neurons_net</b> показан в листинге 3.</p>
<p><em>
<p>Листинг 3. Функтор, реализующий работу нейронной сети</p>
<p></em></p>
<pre name="code" class="cpp">
struct neuro_net_system {
	const link_koefs &amp;_koefs;
	size_t _steps_processed;

	neuro_net_system(const link_koefs &amp;koefs): _koefs(koefs) {}

	bool Execute(neurons_line *line) {
		bool value_changed = false;

		neurons_line old_values(begin(*line), end(*line));
		link_koefs::const_iterator it_koefs = begin(_koefs);

		std::transform(
			begin(*line),
			end(*line),
			begin(*line),
			[&amp;old_values, &amp;it_koefs, &amp;value_changed] (neuron_state old_value) -&gt; neuron_state {
				koef_t tmp_val = std::inner_product(
					begin(old_values),
					end(old_values),
					begin(*it_koefs++),
					koef_t(0)
				);
				neuron_state new_value = (tmp_val &gt; 0 ? UPPER_STATE : LOWER_STATE);
				value_changed = (new_value != old_value) || value_changed;

				return new_value;
		});

		return value_changed;
	}

	neurons_line* operator () (neurons_line *line) {
		bool need_continue = true;
		_steps_processed = 0;

		while (need_continue) {
			need_continue = Execute(line);
			++_steps_processed;
		}

		return line;
	}
};
</pre>
<p>Для вывода в консоль входных и выходных образов создан тип <b>neurons_line_print_descriptor</b>, который хранит ссылку на образ и формат форматирования (ширину и высоту прямоугольника, в который будет вписан образ). Для этого типа переопределен оператор <b>&lt;&lt;</b>. Исходный код типа <b>neurons_line_print_descriptor</b> и оператора вывода в поток показан в листинге 4.</p>
<p><em>
<p>Листинг 4. Обучение нейронной сети</p>
<p></em></p>
<pre name="code" class="cpp">
struct neurons_line_print_descriptor {
	const neurons_line &amp;_line;
	const size_t _width;
	const size_t _height;

	neurons_line_print_descriptor (const neurons_line &amp;line, size_t width, size_t height): _line(line), _width(width), _height(height) {}
};

template &lt;typename Ch, typename Tr&gt;
std::basic_ostream&lt;Ch, Tr&gt;&amp; operator &lt;&lt; (std::basic_ostream&lt;Ch, Tr&gt;&amp;stm, const neurons_line_print_descriptor &amp;line) {
	neurons_line::const_iterator it = begin(line._line), it_end = end(line._line);

	for (size_t i = 0; i &lt; line._height; ++i) {
		for (size_t j = 0; j  0)
				cout &lt;&lt; &quot; &quot;;
			else
				cout &lt;&lt; &quot;0&quot;;
			++it;
		}
		cout &lt;&lt; endl;
	}

	return stm;
}
</pre>
<p>Рабочий пример можно скачать <a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/NeuroTest.zip">отсюда</a>.<br />
Пример представляет собой проект MS VisualStudio 2010. Пример компилируется компиляторами VC++ и Intel C++ (другие компиляторы не проверялись).</p>
<h1>Пример работы нейронной сети</h1>
<p>Для проверки работоспособности реализации, нейронная сеть была обучена 2 ключевым образам:</p>
<p><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/learn1.png" alt="learn1" />    <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/learn2.png" alt="learn2" /></p>
<p><em>
<p>Рис.3 Ключевые образы</p>
<p></em></p>
<p />
<p>На вход подавались искаженные образы. Нейронная сеть корректно распознала исходные образы. Искаженные образы и распознанные образы показаны на рис.4, 5</p>
<p><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/src1.png" alt="src1" />    <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/dst1.png" alt="dst1" />
</p>
<p><em>
<p>Рис.4 Распознавание образа 1</p>
<p></em></p>
<p />
<p><img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/src2.png" alt="src2" />    <img align="bottom" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/dst2.png" alt="dst2" /></p>
<p><em>
<p>Рис.5 Распознавание образа 2</p>
<p></em></p>
<p />
<p>Запуск программы производится из командной строки строчкой вида: <b>AppName WIDTH HEIGHT SOURCE_FILE [LEARNE_FILE_N]</b>, где:</p>
<li><b>AppNaame</b> - название исполняемого файла;</li>
<li><b>WIDTH</b>, <b>HEIGHT</b> - ширина и высота прямоугольника, в который будут вписываться выходной и ключевые образы;</li>
<li><b>SOURCE_FILE</b> - исходный файл с начальным образом;</li>
<li><b>[LEARNE_FILE_N]</b> - один или несколько файлов с ключывыми образами (через пробел).</li>
</ul>
</p>
<h1>Использованная литература</h1>
</p>
<ol>
<li>Г.Г. Малинецкий. Математические основы синергетики. Москва, URSS, 2009.</li>
<li>Статья "<a href="http://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C_%D0%A5%D0%BE%D0%BF%D1%84%D0%B8%D0%BB%D0%B4%D0%B0">Нейронная_сеть_Хопфилда</a>" на Википедии.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/12/22/finereader-2/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>Счастлив с Intel Quick Sync</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/11/29/intel-quick-sync/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/11/29/intel-quick-sync/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 06:09:40 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Графика]]></category>
		<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[ArcSoft MediaConverter 7]]></category>
		<category><![CDATA[Intel Quick Sync Technology]]></category>
		<category><![CDATA[ultrabook]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/11/29/intel-quick-sync/</guid>
		<description><![CDATA[Коллеги, в моей жизни только что произошло очень важное событие. Я наделся, что все случится раньше, но по ряду причин волнующее знакомство приходилось откладывать месяц за месяцем. И вот, наконец, свершилось. Несколько часов назад я впервые попробовал в действии технологию Intel Quick Sync. И у меня нет ни малейшего сомнения в том, что это – Любовь.
]]></description>
			<content:encoded><![CDATA[<p>Коллеги, в моей жизни только что произошло очень важное событие. Я наделся, что все случится раньше, но по ряду причин волнующее знакомство приходилось откладывать месяц за месяцем. И вот, наконец, свершилось. Несколько часов назад я впервые попробовал в действии технологию <a href="http://www.intel.com/content/www/ru/ru/architecture-and-technology/quick-sync-video/quick-sync-video-consumer.html">Intel Quick Sync</a>. И у меня нет ни малейшего сомнения в том, что это – Любовь.</p>
<p>Кроме шуток, о самой технологии я, конечно, знал давно. Но все как-то не складывалось познакомиться. Весь компьютерный парк в домохозяйстве казался довольно современным, и ни один Sandy Bridge в него прорваться не мог. И только сейчас, когда у меня на тесте оказался ультрабук Acer Aspire S3,  наконец-то собрался проверить Quick Sync в действии. И то, каюсь, после напоминания Дмитрия Оганезова. Конечно, если бы раньше знал, насколько это классно, я бы и тесты провел давно, и апгрейдом озаботился. Но задним умом мы все крепки, да.</p>
<p>Вот как все было. Сначала поставил на ультрабук программу ArcSoft MediaConverter 7, поддерживающую Intel Quick Sync. Для тестов взял два видеофайла. Первый – довольно большой рип фильма Across The Universe (его обязательно должны посмотреть все поклонники The Beatles) с шириной кадра 1024 точки и продолжительностью 2 часа 13 минут. Второй файл попроще, DVD-рип отечественного фильма «М+Ж» (не могу посмотреть уже больше двух лет, но регулярно использую для опытов), который идет 1 час 16 минут.</p>
<p>В MediaConverter’е выбрал кодирование для PSP. Запустил по очереди оба файла. </p>
<p>Across The Universe перекодировался за <strong>20 минут 7 секунд</strong><br />
«М+Ж» за <strong>10 минут 11 секунд</strong></p>
<p>Пока не буду ничего комментировать, давайте просто запомним эти цифры.</p>
<p>По завершению конвертации на ультрабуке я установил ту же программу на большом компьютере. Запустил те же файлы с теми же настройками конвертации.</p>
<p>На выходе получил <strong>27 минут 24 секунды </strong>и <strong>14 минут 42 секунды </strong>соответственно.</p>
<p>А вот теперь уже точно можно начинать восхищаться.</p>
<p>В ультрабуке трудится скромный ULV-процессор Intel Core i5-2467M с рабочей частотой 1.6 ГГц. У него два ядра с поддержкой HT, и под нагрузкой он может разогнаться до 2.1 ГГц, или даже до 2.3, если нагружается только одно ядро. Но это настоящий Sandy Bridge со всеми вытекающими. TDP его составляет 17W.</p>
<p>В моем домашнем компьютере установлен четырехъядерный Core i7-965 Extreme Edition с рабочей частотой 3.2 ГГц. Под нагрузкой – 3.46 ГГц. TDP 130W.</p>
<p>Так вот этого МОНСТРА ULV-процессор с Quick Sync сделал одной левой. И, знаете ли, во время кодирования еще умудрялся периодически сбрасывать частоту до 800 МГц!!! Как бы намекая, что ему совсем не тяжело.</p>
<p>Даже не знаю – что тут скажешь? Восторг! Экстаз! Торжество технологий в чистом виде!</p>
<p>Я бы, наверное, даже не смог от удивления написать этот пост, но мои чувства чуть охладил проверенный конвертер Xvid4PSP. Оказалось, что ArcSoft MediaConverter 7 как-то не очень эффективно использует старый Core i7, а вот Xvid4PSP умеет нагружать его полностью. </p>
<p>Результаты оказались такие:</p>
<p>Across The Universe:  <strong>24 минуты 23 секунды</strong><br />
«М+Ж»: <strong>12 минут 18 секунд секунд</strong></p>
<p>Отрыв вроде бы сократился. Но не забываем, что ядер В ДВА раза меньше, а частота их тоже ВДВОЕ ниже. То есть налицо, как минимум, четырехкратное превосходство ультрамобильного современного процессора над монстром прошлого поколения. А уж десктопные ребята уделали бы моего старичка еще более сурово.</p>
<p>Конечно, сейчас уже нет особого смысла переходить на Core i7 второго поколения, потому что не за горами третье. Но, думаю, в феврале-марте домашний компьютер подвергнется тотальному апгрейду. Теперь я точно знаю – зачем мне это нужно.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/11/29/intel-quick-sync/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2-ой вебинар серии «Оптимизация графических приложений». Уже завтра!</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/10/20/2005464/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/10/20/2005464/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 13:22:50 +0000</pubDate>
		<dc:creator>Svetlana Emelyanova (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[ISN календарь]]></category>
		<category><![CDATA[Графика]]></category>
		<category><![CDATA[Конкурсы и мероприятия]]></category>
		<category><![CDATA[21.10.2011]]></category>
		<category><![CDATA[Intel VTune Amplifier XE]]></category>
		<category><![CDATA[вебинар]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/10/20/2005464/</guid>
		<description><![CDATA[Завтра, 21 октября, не пропустите <a href="http://intelcorp.regsvc.com/E6129">очередной вебинар</a>, на котором мы продолжим обсуждение вопросов производительности графических приложений и расскажем об Intel® VTune™ Amplifier XE 2011. Регистрируйтесь на сайте <a href="http://intelcorp.regsvc.com/E6129">intelcorp.regsvc.com/E6129</a>, чтобы изучить основные возможности и функциональность инструмента.]]></description>
			<content:encoded><![CDATA[<p>Завтра, 21 октября, не пропустите <a href="http://intelcorp.regsvc.com/E6129">второй вебинар</a> по оптимизации графических приложений.</p>
<p>На очередной виртуальной сессии Игорь Воробцов расскажет об Intel® VTune™ Amplifier XE 2011. Этот инструмент входит в состав пакета Intel® Parallel Studio XE 2011 и является новейшим профилировщиком производительности. Вы узнаете как о новых возможностях инструмента, так и о дополнительном функционале, специально предназначенном для разработчиков игр. Вы узнаете о такой интересной функциональной возможности, как анализ кадров для фильтрации результатов профилировки производительности с целью получения информации, на основании которой могут быть предприняты конкретные действия. Эта функция основана на потребностях видеоприложений (таких как игры) и должна соответствовать критериям задержки для каждого видеокадра. Она реализована с использованием общей методики и может быть полезна и в других приложениях, например, в симуляторах циклов.</p>
<p>Регистрируйтесь на сайте <a href="http://intelcorp.regsvc.com/E6129">intelcorp.regsvc.com/E6129</a>, чтобы изучить основные возможности и функциональность инструмента.</p>
<p>Если вы не смогли посетить 1-ый вебинар <a href="http://software.intel.com/ru-ru/articles/trainings-webinars/">серии</a>, видео-запись можно <a href="http://software.intel.com/ru-ru/videos/webinar-intel-tbb/">посмотреть и скачать</a> в нашем Take 5 видео-репозитории. </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/10/20/2005464/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Игра Rage, или Кривая &quot;Ярость&quot;</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/10/19/rage/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/10/19/rage/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 14:56:44 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Графика]]></category>
		<category><![CDATA[Игры]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[id Software]]></category>
		<category><![CDATA[quake]]></category>
		<category><![CDATA[Rage]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/10/19/rage/</guid>
		<description><![CDATA[Последняя игра id Software, на которую я потратил действительно много времени, была Quake 3. Их, правда, потом и вышло-то всего ничего, Doom 3 да Quake 4, но первую я не смог осилить из-за невозможности собрать достаточно мощный для нее компьютер, а вторую даже не стал устанавливать. Культовость-культовостью, а игры радовать должны. Правда, id Software не раз удавалось достучаться до моего сердца, потому что разработанные компанией движки регулярно использовались в неплохих игровых продуктах. Все шло к тому, что в будущем только движками все и ограничится, но вот в прошлом августе обещали выпустить 13/09/2011 совершенно новую игру Rage, а 4 октября нынешнего года, по нынешним меркам почти не опоздав, начала ее продажи. Rage вышла в версиях для PC, Xbox и PS3, и, наверное, нетрудно догадаться – какую именно я решил попробовать.]]></description>
			<content:encoded><![CDATA[<p>Последняя игра id Software, на которую я потратил действительно много времени, была Quake 3. Их, правда, потом и вышло-то всего ничего, Doom 3 да Quake 4, но первую я не смог осилить из-за невозможности собрать достаточно мощный для нее компьютер, а вторую, посмотрев у коллег, даже не стал устанавливать. Культовость-культовостью, а игры радовать должны. Правда, id Software не раз удавалось достучаться до моего сердца, потому что разработанные компанией движки регулярно использовались в неплохих игровых продуктах. Все шло к тому, что в будущем только движками все и ограничится, но вот в прошлом августе обещали выпустить 13/09/2011 совершенно новую игру Rage, а 4 октября нынешнего года, по нынешним меркам почти не опоздав, начала ее продажи. Rage вышла в версиях для PC, Xbox и PS3, и, наверное, нетрудно догадаться – какую именно я решил попробовать.</p>
<p>Еще до покупки игры мне приходилось слышать, что с ней не все в порядке: мол, глючит страшно, и в id Software объясняют проблемы очень просто – мол, компания не рассматривает PC, как основную платформу для игр. И все же я был уверен, что трудности преувеличены: ну может где-нибудь текстурка мигнет, или игра зависнет пару раз за день… В конце концов, это же id Software, «премиальный бренд», не может же она выпустить на рынок совсем недоделанный продукт?</p>
<p>Оказывается, еще как может. И выпустила. На момент выхода Rage была абсолютно неработоспособна на большинстве персональных компьютеров. И сейчас, после выхода нескольких патчей и неоднократных попыток срочного допиливания драйверов производителями графических чипов ситуация остается аховой. </p>
<p>Расскажу о своих мытарствах подробнее. Игра поставляется аж на 3 DVD и занимает на жестком диске больше 15 гигабайт. При первом запуске она порадовала меня дикой мешаниной из текстур, исключающей возможность собственно играть. Несколько озадаченный, я стал советоваться с Интернетом, вывалившим на меня целую груду рецептов. Перво-наперво порекомендовали установить новую бета-версию драйвера для моего Radeon HD6850. Я скачал сначала неправильную, выпущенную 8 октября, и она решала проблему капитально: просто отключала ВСЕ текстуры и всё. Картинка выглядела чуть лучше, чем в легендарном Wolfenstein 3D,но желания поиграть почему-то не вызывала. Добрые люди прислали ссылку на правильную бету, которая Preview 3. При ее установке компьютер впервые за очень долгое время продемонстрировал синий экран, но после аварийной перезагрузки Rage запустилась с текстурами. Счастье, правда, длилось недолго: продемонстрировав свою красоту, игра начала зависать. Делала она это настолько регулярно и разнообразно, что невольно вспомнился перечень способов приготовления креветок из фильма «Форрест Гамп». Она зависала при загрузке уровня, при попытке выйти в главное меню, при переключении задач, при оглашении сути очередного задания, при сохранении игры, при подгрузке текстур… Наконец, больше всего ей нравилось зависать просто так. А бета-драйвер оказался настолько совершенным, что намертво вешал Adobe Photoshop, пока я не догадался отключить в нем поддержку вычислений на GPU.</p>
<p><img src="http://helpix.ru/pic/vilianov/200501/22/rage.jpg" alt="Rage" /></p>
<p>В Интернете советовали поправить реестр, изменив что-то в свойствах драйвера – не помогло. Выкладывали  якобы решающие все проблемы профили настроек – с тем же результатом. Наконец, одна добрая душа посоветовала откатиться на позапрошлую версию драйверов – дескать, с ней все будет в порядке. Действительно, я ликовал минут десять, пока не дошло до загрузки новой локации, во время которой игра намертво зависла. После перезапуска загрузка проходит гладко, но изображение на экране оказалось полностью лишенным текстур… Честно скажу, потратив в общей сложности около шести часов на борьбу с Rage, я сдался. И до появления вестей о полном решении проблем, подтверждаемом авторитетными источниками, запускать эту, с позволения сказать, игру больше не стану.</p>
<p>И вот это – id Software. Легенда, технологический лидер и просто небедный коллектив разработчиков, уж точно способный позволить себе целую банду QA-специалистов. Провал же получился такой, что я даже не могу припомнить аналогов. Да, бывало, новые игры неприлично тормозили и вылетали, но чтобы вообще толком не работали… Нет, не могу вспомнить. </p>
<p>И главное – не получается объяснить причину случившегося. Кроме, разве что, взбешенных пинками менеджеров разработчиков PC-версии, которые из вредности отправили на золото заведомо сырую бета-версию. Мол, не хотите подождать еще полгодика? Ну, вот вам. Продавайте, если сможете.</p>
<p>Что характерно, приставочные версии работают стабильно, но тут всплывает другой меганедостаток: Rage безнадежно однообразна и скучна. Как только надоедает смотреть по сторонам, любуясь действительно роскошными пейзажами, желание играть тут же пропадает. Сюжет никогда не был сильной стороной игр id Software, но тут на нем отдохнули как-то особенно хорошо.</p>
<p>В те короткие моменты, когда игра работала, я смог понаблюдать за нагрузкой на процессор и GPU. С удовлетворением отметил, что движок id Tech 5 эффективно использует четыре ядра процессора, распределяя между ними нагрузку практически поровну. Пиковая нагруженность графического чипа составила 69% (разрешение 1600х1200), но обычно она не превышает 62%. В результате компьютер не перегревается и не шумит.</p>
<p>Поэтому я бы рассматривал Rage как здоровенную демоверсию нового движка, который непременно блеснет в играх других разработчиков. Благо он довольно шустр, а картинка очень, очень хороша. Вот только непонятно – как хватило наглости брать за демоверсию ту же сумму, что и за настоящую игру? </p>
<p>P.S. Заголовок этого поста отсылает к популярному в свое время боевику "Слепая ярость" с Рутгером Хауэром в главной роли. Вот только не уверен, что нынешняя молодежь его вообще помнит <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/2011/10/19/rage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Серия вебинаров по оптимизации графических приложений</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/10/12/2005393/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/10/12/2005393/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 09:01:21 +0000</pubDate>
		<dc:creator>Svetlana Emelyanova (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[ISN календарь]]></category>
		<category><![CDATA[Графика]]></category>
		<category><![CDATA[Конкурсы и мероприятия]]></category>
		<category><![CDATA[14.10.2011]]></category>
		<category><![CDATA[Intel VTune Amplifier XE]]></category>
		<category><![CDATA[Intel® TBB]]></category>
		<category><![CDATA[вебинар]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/10/12/2005393/</guid>
		<description><![CDATA[Летом в нашем сообществе прошел <a href="http://software.intel.com/ru-ru/blogs/2011/06/27/2004696/">вебинар</a>, посвященный графическим инструментам Intel. Уровень технической экспертизы участников мероприятия нас приятно порадовал. Было много хороших технических вопросов. В общем, как мы и ожидали, тема оптимизации игровой графики оказалась очень востребованной.

Мы решили продолжить работу в этом направлении. И вот с 14 октября на ISN стартует <a href="http://software.intel.com/ru-ru/articles/trainings-webinars/">серия из четырех вебинаров</a>, посвященных вопросам производительности графических приложений. ]]></description>
			<content:encoded><![CDATA[<p>Летом в нашем сообществе прошел <a href="http://software.intel.com/ru-ru/blogs/2011/06/27/2004696/">вебинар</a>, посвященный графическим инструментам Intel. Уровень технической экспертизы участников мероприятия нас приятно порадовал. Было много хороших технических вопросов. В общем, как мы и ожидали, тема оптимизации игровой графики оказалась очень востребованной.</p>
<p>Мы решили продолжить работу в этом направлении. И вот с 14 октября на ISN стартует <a href="http://software.intel.com/ru-ru/articles/trainings-webinars/">серия из четырех вебинаров</a>, посвященных вопросам производительности графических приложений. Презенторы – наши инженеры, которые ежегодно на Конференции Разработчиков Игр делятся экспертными знаниями и практическим опытом в сфере оптимизации приложений.</p>
<p>В эту пятницу Кирилл Рогожин <a href="http://intelcorp.regsvc.com/E6077">расскажет</a> о том, как эффективно использовать библиотеку Intel® Threading Building Blocks для распараллеливания кода. Эта библиотека призвана облегчить работу программистам и позволяет сфокусироваться на особенностях своего приложения, а не "изобретать велосипед". С TBB вы сможете сосредоточиться на основных функциях приложения, а не на организации и отладке многопоточной работы.</p>
<p>Через неделю, 21 октября, вас ждет <a href="http://intelcorp.regsvc.com/E6129">виртуальная сессия</a>, посвященная инструменту Intel® VTune™ Amplifier XE 2011, который является новейшим профилировщиком производительности. Игорь Воробцов представит новые возможности и функциональность VTune™ Amplifier, такие как временная линия потоков, статистическое дерево вызовов, мультиплексирование событий, а также ряд дополнительных функциональных возможностей, специально предназначенных для разработчиков игр, которым нужен более комплексный подход. Использование инструмента Intel® VTune™ Amplifier XE 2011 будет продемонстрировано на примере работы с игрой «Total War: Empire».</p>
<p>На двух последних вебинарах <a href="http://software.intel.com/ru-ru/blogs/author/victoria-zhislina/">Виктория Жислина</a> расскажет о том, как учитывать особенности CPU (устройство кэш-памяти, предсказание ветвлений, out-of-order исполнение, SIMD инструкции, включая Advanced Vector Extensions) для создания максимально оптимизированных приложений, а также о схеме построения игрового движка на основе задач (tasks).</p>
<p>Ознакомиться с расписанием и зарегистрироваться на вебинары можно на <a href="http://software.intel.com/ru-ru/articles/trainings-webinars/">этой</a> странице. Регистрация на последние два вебинара серии откроется в самое ближайшее время.</p>
<p>Регистрируйтесь, следите за обновлениями и приходите на наши виртуальные сесии. Увидимся в эту пятницу!</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/10/12/2005393/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

