<?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; ixanezis</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/author/ixanezis/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/ru-ru/blogs</link>
	<description></description>
	<lastBuildDate>Thu, 24 May 2012 12:16:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Пару слов о тайлинге</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/11/25/2005946/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/11/25/2005946/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 08:50:13 +0000</pubDate>
		<dc:creator>ixanezis</dc:creator>
				<category><![CDATA[Конкурсы и мероприятия]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[Tailings]]></category>
		<category><![CDATA[тайлинг]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/11/25/2005946/</guid>
		<description><![CDATA[Для тех, кто только начинает осваивать мир параллельных технологий, хотелось бы поведать начальные сведения о том, что такое тайлинг и с чем его едят.

Тайлинг представляет собой метод написания параллельных программ (распараллеливания существующих), когда циклы программы разбиваются на куски (тайлы) не очень большого размера. В случае системы с распределённой памятью все необходимые данные для выполнения одного тайла целиком отправляются на какой-то процессор/машину, где происходит непрерывное выполнение требуемой части кода (непрерывное = без остановок на получение/отсылку данных), после чего посчитанный результат отсылается обратно главному процессору. В случае же системы с общей памятью (имеется в виду общая сверхбыстрая память - кэш одного процессора) разбиение на тайлы подразумевает собой логическое разбиение цикла на куски, при котором все потоки совместно работают над одним не очень большим куском памяти, что приводит к лучшему использованию кэша процессора, в котором они все работают.]]></description>
			<content:encoded><![CDATA[<p>Для тех, кто только начинает осваивать мир параллельных технологий, хотелось бы поведать начальные сведения о том, что такое тайлинг и с чем его едят.</p>
<p>Тайлинг представляет собой метод написания параллельных программ (распараллеливания существующих), когда циклы программы разбиваются на куски (тайлы) не очень большого размера. В случае системы с распределённой памятью все необходимые данные для выполнения одного тайла целиком отправляются на какой-то процессор/машину, где происходит непрерывное выполнение требуемой части кода (непрерывное = без остановок на получение/отсылку данных), после чего посчитанный результат отсылается обратно главному процессору. В случае же системы с общей памятью (имеется в виду общая сверхбыстрая память - кэш одного процессора) разбиение на тайлы подразумевает собой логическое разбиение цикла на куски, при котором все потоки совместно работают над одним не очень большим куском памяти, что приводит к лучшему использованию кэша процессора, в котором они все работают.</p>
<p>В качестве примера рассмотрим массив А размера N и некоторый алгоритм на ней:</p>
<pre name="code" class="cpp">for (int i=0; i&lt;N; ++i)
     // Do something with A[i]</pre>
<p>Казалось бы, что всё отлично. Но, допустим, мы решили распараллелить этот алгоритм на n-ядерном процессоре с помощью любой технологии типа OpenMP, TBB. Тогда при достаточно больших N получится, что первый поток работает над куском массива от 0 до 100000, второй - от 100000 до 200000, и т.д. На самом деле мы можем не получить никакого прироста в скорости, потому при таком подходе в кэш процессора будут поочерёдно загружаться/выгружаться данные, локальные для первого потока, потом для второго, потом снова для первого и т.д. Гораздо лучшим подходом будет переписать код следующим образом:</p>
<pre name="code" class="cpp">for(int t=0; t&lt;N/tileSize; ++t)
    for(int i=tileSize * t; i &lt; tileSize * (t+1); ++i)
        // Do somethin with A[i]</pre>
<p>Здесь также будем параллелить цикл по i. Визуально вместо одного простого цикла получили 2 вложенных, однако, очевидно, что они выполняют одинаковое число операций, с той лишь разницей, что теперь все данные, необходимые в цикле по i, находятся "недалеко" друг от друга. Понятие "недалеко" регулируется параметром tileSize. Теперь, удачно подобрав этот параметр, можно добиться того, что все элементы массива А, нужные в цикле по i, сразу попадут в кэш процессора и таким образом все потоки будут работать с одним и тем же куском памяти, который не нужно будет постоянно загружать или выгружать из памяти.</p>
<p>Понятно, что разбивать на тайлы можно циклы любой размерности, всё зависит лишь от конкретных условий задачи и системы, на которой это будет работать.</p>
<p>Более приближенные к практике примеры можно найти на вики <a href="http://en.wikipedia.org/wiki/Loop_tiling">http://en.wikipedia.org/wiki/Loop_tiling</a><br />
Вот и всё на сегодня, всем удачи в параллельных алгоритмах!</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/11/25/2005946/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

