<?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>Intel® Software Network (FR) &#187; programmation parallèle</title>
	<atom:link href="http://software.intel.com/fr-fr/blogs/category/programmation-parallele/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/fr-fr/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 14 May 2012 06:49:52 +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>Create a Ubuntu 11.04 LiveUSB to use Intel® Parallel Studio XE</title>
		<link>http://software.intel.com/fr-fr/blogs/2012/05/14/create-a-ubuntu-1104-liveusb-to-use-intel-parallel-studio-xe/</link>
		<comments>http://software.intel.com/fr-fr/blogs/2012/05/14/create-a-ubuntu-1104-liveusb-to-use-intel-parallel-studio-xe/#comments</comments>
		<pubDate>Mon, 14 May 2012 06:49:52 +0000</pubDate>
		<dc:creator>Xavier Hallade (Intel)</dc:creator>
				<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[ISN France]]></category>
		<category><![CDATA[programmation parallèle]]></category>

		<guid isPermaLink="false">http://software.intel.com/fr-fr/blogs/2012/05/14/create-a-ubuntu-1104-liveusb-to-use-intel-parallel-studio-xe/</guid>
		<description><![CDATA[You need a license for Intel® Parallel Studio XE for Linux and and at least a 4GB USB Key. Get an ISO image of Ubuntu 11.04. Create a new Ubuntu 11.04 LiveUSB, with persistence mode enabled (you can specify a size of 1mo for the persistence file, you will overwrite it with a ~3Go file [...]]]></description>
			<content:encoded><![CDATA[<p>You need a <a href="https://registrationcenter.intel.com/RegCenter/AutoGen.aspx?ProductID=1538&amp;AccountID=&amp;EmailID=&amp;ProgramID=&amp;RequestDt=&amp;rm=EVAL&amp;lang=">license</a> for Intel® Parallel Studio XE for Linux and and at least a 4GB USB Key.</p>
<p>Get an <a href="http://releases.ubuntu.com/natty/ubuntu-11.04-desktop-amd64.iso">ISO image</a> of Ubuntu 11.04.</p>
<p>Create a new Ubuntu 11.04 LiveUSB, with persistence mode enabled (you can specify a size of 1mo for the persistence file, you will overwrite it with a ~3Go file in the next step).</p>
<p>To do that from Windows, you can use <a href="http://www.linuxliveusb.com/">LiLi</a> :<br />
<a href="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/screenshot-lili.png"><img src="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/screenshot-lili-180x300.png" alt="" width="180" height="300" class="aligncenter size-medium wp-image-675" /></a><br />
but any other tool like Unetbootin or USB Universal Installer is fine.</p>
<p>Download <a href="http://intel-software-academic-program.com/download/ubuntu/casper-rw.zip">casper-rw.zip</a> and unzip casper-rw to the root of your freshly built Ubuntu LiveUSB :<br />
<a href="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/screenshot-casper.png"><img src="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/screenshot-casper-300x155.png" alt="" width="300" height="155" class="aligncenter size-medium wp-image-674" /></a><br />
It is a persistence file that contains an installation of Parallel Studio XE 2011 SP1 Update1.</p>
<p>Create a new folder at the root of your key, named "intel-licenses", and put your .lic file inside it.</p>
<p>Now you are ready to boot on this LiveUSB and directly use Intel® tools to accelerate your code <img src='http://software.intel.com/fr-fr/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/fr-fr/blogs/2012/05/14/create-a-ubuntu-1104-liveusb-to-use-intel-parallel-studio-xe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retour d&#039;expérience concours Acceler&#039;8</title>
		<link>http://software.intel.com/fr-fr/blogs/2012/02/01/retour-dexprience-concours-acceler8/</link>
		<comments>http://software.intel.com/fr-fr/blogs/2012/02/01/retour-dexprience-concours-acceler8/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 16:53:41 +0000</pubDate>
		<dc:creator>rimaxime</dc:creator>
				<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[programmation parallèle]]></category>

		<guid isPermaLink="false">http://software.intel.com/fr-fr/blogs/2012/02/01/retour-dexprience-concours-acceler8/</guid>
		<description><![CDATA[La nouvelle édition du concours acceler'8 a pris fin il y'a un peu plus d'un mois. Contrairement au concours précédent, nous n'avons pas publié d'article. Il faudrait que nous le fassions à l'occasion. C'etait une part intéressante du concours précédent. Les contraintes de la vie courante reprennent vite leur place. Il m'a fallu un peu [...]]]></description>
			<content:encoded><![CDATA[<p>La nouvelle édition du concours acceler'8 a pris fin il y'a un peu plus d'un mois. Contrairement au concours précédent, nous n'avons pas publié d'article.</p>
<p>Il faudrait que nous le fassions à l'occasion. C'etait une part intéressante du concours précédent.</p>
<p>Les contraintes de la vie courante reprennent vite leur place. Il m'a fallu un peu de temps pour me décider d'écrire ce message.</p>
<p><em><br />
<div id="attachment_626" class="wp-caption aligncenter" style="width: 310px"><a href="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/IMAG0105.jpg"><img src="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/IMAG0105-300x179.jpg" alt="Image_SSD" width="300" height="179" class="size-medium wp-image-626" /></a><p class="wp-caption-text">Une petite photo du disque SSD gagné <img src='http://software.intel.com/fr-fr/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></div><br />
</em></p>
<p>Cet édition a été un événement intense. Contrairement à l'édition précédente, nous avons dû travailler sur un problème reconnu.<br />
Un gros travail de recherche à effectuer. Ce fut loin d'être facile, mais au combien passionnant.</p>
<p>Nous sommes partis finalement sur une simple implémentation de l'algorithme de <a href="http://alexeigor.wikidot.com/kadane">Kadan 2D</a> pour rechercher les coordonnées du tableau maximum à l'intérieur d'un tableau contenant des valeurs négatives et positives.</p>
<p>Cette fois ci, nous ne découvrions plus la programmation parallèle. Nous avons décidé de nous lancer dans le C++ et d'exploiter la librairie <a href="http://software.intel.com/en-us/articles/intel-tbb/">Intel Threading Block</a>.</p>
<p>Nous avons à première vue était agréablement surpris. Nous avions trouvé dans cette librairie un excellent compromis entre la puissance et la souplesse de configuration des threads.<br />
Ce concours fut vraiment l'occasion de découvrir ce produit. Je ne saurai que en recommander l'usage.</p>
<p>Nous avons commis une erreur. Mon binome a perdu pratiquement un week end à chercher à améliorer les performances d'une section de code qui en faite répondait totalement à nos exigences.</p>
<p>Au final, le goulet d'étranglement de notre application se trouvait à la lecture du fichier.</p>
<p>Nous nous sommes rendus compte de ça, trop tard malheureusement, grace à l'outil <a href="http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/">Intel Vtune</a>. Nous avons découvert trop tard que nous pouvions l'utiliser sur la MTL.<br />
Donc un simple regret, ne pas avoir eu accès à cet outil plus facilement. Même sur la MTL, c'etait délicat et relativement fastidieux de l'utiliser.</p>
<p><em><br />
<div id="attachment_632" class="wp-caption aligncenter" style="width: 310px"><a href="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/Intel_SW-IntelVTuneAmplifierXEOverview4161.jpg"><img src="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/Intel_SW-IntelVTuneAmplifierXEOverview4161-300x168.jpg" alt="Intel Vtune" width="300" height="168" class="size-medium wp-image-632" /></a><p class="wp-caption-text">Intel Vtune</p></div><br />
</em></p>
<p>Donc au cours de cette édition, nous avons découvert l'écosystème proposé par Intel que nous ne connaissions que de nom. La dernière fois, la découverte de la programmation parallèle avait pris tout notre temps.<br />
Face au problème que nous avons rencontré,c'est certain que avec ces outils, nous l'aurions facilement contourné. Ils sont beaucoup plus simples à utiliser que je le pensais à l'origine. Au final, quelques clics et nous avions la vue complète de l'exécution de notre application. J'imagine vraiment l'intéret pour l'optimisation de systèmes plus complexes.</p>
<p>Je profite de ce poste pour soumettre une idée pour la prochaine edition.<br />
Nous aurions aimé disposer d'une machine virtuelle avec tous les outils d'Intel installés pour la durée du concours. Ca nous aurait simplifié la vie et poussé à les découvrir.<br />
Je suis certain qu'il nous reste encore beaucoup à en apprendre.</p>
<p>Nous avons beaucoup apprécié l'ouverture à l'international. Ca donnait une dimension et un enjeu différent.<br />
C'etait impressionnant la communauté de développeurs qui a été rassemblés et l'engouement sur les forums anglais.<br />
Nous avons également beaucoup apprécié l'entraide qui reignait et le partage (notamment les generateurs de matrice). C'est grace à certaines de ces contributions que nous avons réussi à utiliser Intel Vtune, sinon nous serions totalement passés à coté.</p>
<p>Cette fois ci, avec un code non optimisé pour la lecture du fichier, nous avons terminé 23 ème.<br />
Même si c'est honorable, il ne nous reste plus qu'à mieux faire lors de la prochaine édition.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/fr-fr/blogs/2012/02/01/retour-dexprience-concours-acceler8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maximum Subarray Problem - Simple Parallelization and Optimizations</title>
		<link>http://software.intel.com/fr-fr/blogs/2011/12/22/maximum-subarray-problem-simple-parallelization-and-optimizations/</link>
		<comments>http://software.intel.com/fr-fr/blogs/2011/12/22/maximum-subarray-problem-simple-parallelization-and-optimizations/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 13:26:53 +0000</pubDate>
		<dc:creator>neshone</dc:creator>
				<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[programmation parallèle]]></category>

		<guid isPermaLink="false">http://software.intel.com/fr-fr/blogs/2011/12/22/maximum-subarray-problem-simple-parallelization-and-optimizations/</guid>
		<description><![CDATA[University of Novi Sad Faculty of Technical Sciences, Department of Computing and Control authors: Predrag Ilkic, Nenad Jovanovic Date: October 15th 2011 - November 15th 2011 Introduction: This article is an explanation of our method for solving the maximumim subarray problem during the Intel Acceler8 contest. The team consisted of one fourth year university student [...]]]></description>
			<content:encoded><![CDATA[<p><span lang="EN"></p>
<p align="center"><span lang="EN"><font size="2">University of Novi Sad</font>
</p>
<p align="center"><font size="2">Faculty of Technical Sciences, Department of Computing and Control</font></p>
<p align="center"><font size="2">authors: Predrag Ilkic, Nenad Jovanovic</font></p>
<p align="center"><font size="2">Date: October 15th 2011 - November 15th 2011</font></p>
<h2 class="MsoNormal"><span><font size="5">Introduction:</font></span><span><span lang="EN"></h2>
<p>This article is an explanation of our method for solving the maximumim subarray problem during the Intel Acceler8 contest. The team consisted of one fourth year university student and one fourth grade high school student.</p>
<p>The problem was the following: in the given matrix, find the subarray (corner coordinates) that has the maximum sum of elements. The algorithm used for the solution was the well-known Kadane's algorithm adapted for two-dimensional<br />
arrays. We started the project using the OpenMP, but at one point we switched to pthreads because we got much better results. The algorithm wasn't too complex for implementation so the transition went quite smoothly. The only downside of<br />
pthread solution was that we switched to it much too late so we never had the time to try out some of our ideas that failed with OpenMP. The compiler used was gcc, no other compilers were tested.</p>
<p><span lang="EN"></p>
<h2>1 - matrix parsing</span></span></span></span></span></h2>
<p><span lang="EN"></p>
<p>Matrix parsing and loading was done sequentially. While in the OpenMP phase of the project, we tried to parallelize the matrix parsing and loading, but without success. The results were pretty much the same at best, so the solution<br />
was dropped. No parsing parallelization was attempted with pthreads due to the lack of time.</p>
<p>Matrix parsing was done using tha standard fread() function. One chunk at the time was loaded into memory. It was parsed, firstly, by counting all of the spaces to get the column count and then by counting the linebreaks to get the<br />
row count. After acquiring the matrix size, we allocated the appropriate amount of memory. The matrix was then loaded into memory in an appropriate way depending on the number of rows and columns (whether or not rows&gt;columns -<br />
this effects the complexity of the solution which is calculated O(rows*rows*columns)). This enabled us not to waste time on matrix transposing later. The loading was done using our own integer reading. We found it much<br />
faster compared to standard fscanf(). The matrix from the file itself was never actually loaded into memory. We just used the integers read to generate the prefix sum matrix. Only the prefix sum matrix was processed in this<br />
solution.</p>
<p></span><span lang="EN"></p>
<h2>2 - parallelization and optimizations</h2>
<p><span lang="EN"></p>
<p>The whole parallelization process was done in OpenMP and later literally translated to pthreads. Since the Kadane algorithm consists of three nested for loops, the parallelization was done on the outer most for loop to decrease<br />
overhead and increase data locality and cache hit rate. All interations in the outer loop are completely independant so parallelizing the algorithm in this way enables great scalability. Every iteration is picked up for processing by one of<br />
the worker threads. Every iteration is processed one by one until all iterations are processed. We tried different types of scheduling with OpenMP. Static scheduling was the least effective and dynamic and guided scheduling gave very<br />
similar results so we preoceeded with dynamic scheduling which has just been explained. After the transition to pthreads, dynamic scheduling was kept and no other scheduling types were tried due to before mentioned lack of time. Every<br />
worker thread collects it's own results from which is later picked the final result. This was done to eliminate any thread synchronization that might slow down performance.</p>
<p><span lang="EN"></p>
<h2>3 - results</h2>
<p><span lang="EN"></p>
<p>For starters, here are some matrix parsing and loading timings:</p>
<table border="1" cellspacing="0" cellpadding="3" width="20%" align="left">
<tr>
<td width="50%" align="center">matrix size</td>
<td align="center">timing</td>
</tr>
<tr>
<td width="50%" align="center">1000x1000</td>
<td align="center">39.35 ms</td>
</tr>
<tr>
<td width="50%" align="center">2000x2000</td>
<td align="center">153.2 ms</td>
</tr>
<tr>
<td width="50%" align="center">5000x5000</td>
<td align="center">984.52 ms</td>
</tr>
<tr>
<td width="50%" align="center">8000x8000</td>
<td align="center">2466.63 ms</td>
</tr>
</table>
<p></P></span></p>
<h2></span>&nbsp;</h2>
<h2></span></span>&nbsp;</h2>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span lang="EN"></p>
<p>And here are the timings of the whole algorithm:</p>
<p></span></p>
<table border="1" cellspacing="0" cellpadding="3" width="30%" align="left">
<tr>
<td align="center">matrix size</td>
<td width="33%" align="center">number of cores</td>
<td width="33%" align="center">timing</td>
</tr>
<tr>
<td align="center">1000x1000</td>
<td width="33%" align="center">1</td>
<td width="33%" align="center">1.523 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">8</td>
<td width="33%" align="center">0.223 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">16</td>
<td width="33%" align="center">0.132 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">24</td>
<td width="33%" align="center">0.104 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">32</td>
<td width="33%" align="center">0.089 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">40</td>
<td width="33%" align="center">0.082 s</td>
</tr>
<tr>
<td align="center">2000x2000</td>
<td width="33%" align="center">1</td>
<td width="33%" align="center">12.093 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">8</td>
<td width="33%" align="center">1.683 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">16</td>
<td width="33%" align="center">0.891 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">24</td>
<td width="33%" align="center">0.646 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">32</td>
<td width="33%" align="center">0.525 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">40</td>
<td width="33%" align="center">0.465 s</td>
</tr>
<tr>
<td align="center">5000x5000</td>
<td width="33%" align="center">20</td>
<td width="33%" align="center">11.886 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">30</td>
<td width="33%" align="center">7.584 s</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">40</td>
<td width="33%" align="center">6.041 s</td>
</tr>
<tr>
<td align="center">8000x8000</td>
<td width="33%" align="center">20</td>
<td width="33%" align="center">52.050</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">30</td>
<td width="33%" align="center">34.685</td>
</tr>
<tr>
<td align="center">&nbsp;</td>
<td width="33%" align="center">40</td>
<td width="33%" align="center">26.234</td>
</tr>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font size="1"></font>&nbsp;</p>
<p><font size="1"></font>&nbsp;</p>
<p><font size="1"></font>&nbsp;</p>
<p><font size="1"></font>&nbsp;</p>
<p><font size="1"></font>&nbsp;</p>
<p><font size="1"></font>&nbsp;</p>
<p><font size="1"></font>&nbsp;</p>
<p><span lang="EN"></p>
<p>No fancy graphs or pictures <img src='http://software.intel.com/fr-fr/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span lang="EN"></p>
<h2>4 - conclusion</h2>
<p><span lang="EN"></p>
<p>As the results show, for smaller matrices, speed up drops greatly because of the large part of execution that the sequential part of the code takes. As the matrix gets larger, the speed up grows to almost linear.</p>
<p>   The code, makefile and the readme file from the contest are attached. The password for the archive is "secret". We tried to make the code well commented, so it should be easy to understand. You can download all of it <a href="http://software.intel.com/en-us/blogs/wordpress/wp-content/uploads/2011/12/solution.zip">here</a>.</p>
<p>For the end, we'd like to say that the contest was a pleasure, a great experience and a great chance to learn something new and useful as well as try it out properly(40 core MTL was great:)).</p>
<p></span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/fr-fr/blogs/2011/12/22/maximum-subarray-problem-simple-parallelization-and-optimizations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maximum Subarray Problem using TBB and Pipelines</title>
		<link>http://software.intel.com/fr-fr/blogs/2011/12/16/maximum-subarray-problem-using-tbb-and-pipelines/</link>
		<comments>http://software.intel.com/fr-fr/blogs/2011/12/16/maximum-subarray-problem-using-tbb-and-pipelines/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 10:01:17 +0000</pubDate>
		<dc:creator>ph0b</dc:creator>
				<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[programmation parallèle]]></category>

		<guid isPermaLink="false">http://software.intel.com/fr-fr/blogs/2011/12/16/maximum-subarray-problem-using-tbb-and-pipelines/</guid>
		<description><![CDATA[Algorithm Kadane 2d's classic algorithm has a complexity of O(r²c), where r is the number of rows and c the number of cols. We use it when there is more columns than rows, but instead of tranposing the matrix for the opposite case, we developed a second algorithm that is O(c²r). It's basically a transposition [...]]]></description>
			<content:encoded><![CDATA[<h2 style="margin-top:20px">Algorithm</h2>
<p>Kadane 2d's classic algorithm has a complexity of O(r²c), where r is the number of rows and c the number of cols.</p>
<p>We use it when there is more columns than rows, but instead of tranposing the matrix for the opposite case, we developed a second algorithm that is O(c²r). It's basically a transposition of Kadane 2d's algorithm :</p>
<pre>
      for(size_t colStartIndex=0; colStartIndex!=numberOfCols; ++colStartIndex)
         for(size_t rowIndex=0;rowIndex!=numberOfRows;++rowIndex)
            for (size_t colEndIndex = colStartIndex; colEndIndex!=numberOfCols; ++colEndIndex)
                    // do one step of kadane's 1D maximum subarray search (one step for one row)
		    // a kadane's 1D search is associated to a (colStartIndex, colEndIndex) pair
</pre>
<p>The position of the loop on rows is carefully choosen. It's not the most innerloop because we would have very bad cache locality, and it can't be parallelized so we didn't put it as the most outer loop.</p>
<h2 style="margin-top:25px">Pipelining</h2>
<p>We assumed that reading the file was a really slow and sequential process, and our work is based on that assumption. The other teams have proven that it wasn't true - on the MTL at least.</p>
<p>Our goal was to start searching the maximum subarray before the file was entirely read. We modified our algorithm's implementations to work on slices of matrix, in order, coming from the pipeline.</p>
<p>The pipeline serially read slices of the input file, then each slice is parsed in parallel, and sent to the search.</p>
<p>We choosed to work on slices of files of a size inferior to the L3 cache and used circular buffers to avoid memory reallocation.</p>
<p>The O(c²r) algorithm doesn't need to remember the previous slice of matrix to work : only two values, indexed by colStartIndex and colEndIndex, are needed for continuing the kadane 1d search. So the memory footprint is independant on the number of rows.</p>
<p>Here is the pipeline definition for the O(c²r) implementation :</p>
<pre>
    tbb::parallel_pipeline(
            ntoken,
            tbb::make_filter(
                tbb::filter::serial_in_order,
                InputFileReader(file, textSlices, ntoken)
            ) // read a chunk of the file (n-rows)
            &amp;
            tbb::make_filter(
                tbb::filter::parallel,
                TextLinesToArray(matrixes, /*prefixedSum=*/true)
            ) 	// parse this chunk to fill corresponding matrix
		// with a prefixedSum done on each line
            &amp;
            tbb::make_filter(
                tbb::filter::serial_in_order,
                MaximumSubarraySearchCCRStep(&amp;kadaneSavedResults, &amp;numberOfRows, &amp;result)
            )
        ); // add the matrix to the search
</pre>
<h2 style="margin-top:25px">Parallelization</h2>
<p>We already parallelized the parsing of the matrix using the pipeline. For the searching part, we used tbb::parallel_reduce() on the most outer loop (on colStartIndex for both algorithms). Given the triangle-balanced nature of the problem, we defined a specific tbb::range.<br />
The length of this range is defined using it's length, then multiplied by it's position. The grainsize of the parallel_reduce is divided by the number of rows for the O(c²r) algorithms and by the number of cols for the other one. Splitting the range is done at the first 3rd instead of at the middle of the range.<br />
This is a bit tricky, but a range should stay as simple as possible because its split function is used a really high number of times. Every of our tentatives to do smarter splitting involving a bit more calculation didn't succeed.<br />
We didn't have the time to try to directly use parallel tasks instead of ranges and parallel_reduce. It might have much better performances, allowing a better task splitting with less overhead.</p>
<p>Our program scaled very well but there is much overhead that doesn't depend on the number of cores, these are some results we had on 40 :</p>
<ul>
<li>1000x1000 : 1.64s user 0.06s system 2022% cpu 0.084 total</li>
<li>2000x2000 : 11.69s user 0.09s system 3138% cpu 0.375 total</li>
<li>4000x4000 : 108.18s user 0.25s system 3684% cpu 2.943 total</li>
<li>8000x8000 : 758.06s user 1.21s system 3865% cpu 19.642 total</li>
<li>10000x10000 : 1431.10s user 1.79s system 3895% cpu 36.781 total</li>
</ul>
<p>The source code is here : <a href='http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/maxSubarraySearch-TBB-Pipelines.zip'>maxSubarraySearch-TBB-Pipelines.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/fr-fr/blogs/2011/12/16/maximum-subarray-problem-using-tbb-and-pipelines/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subarray Problem - A static NUMA-Aware approach</title>
		<link>http://software.intel.com/fr-fr/blogs/2011/11/24/subarray-problem-a-static-numa-aware-approach/</link>
		<comments>http://software.intel.com/fr-fr/blogs/2011/11/24/subarray-problem-a-static-numa-aware-approach/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 12:19:44 +0000</pubDate>
		<dc:creator>krahnack</dc:creator>
				<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[ISN France]]></category>
		<category><![CDATA[programmation parallèle]]></category>

		<guid isPermaLink="false">http://software.intel.com/fr-fr/blogs/2011/11/24/subarray-problem-a-static-numa-aware-approach/</guid>
		<description><![CDATA[The subarray problem on a n*m matrix is sequentially solved using an algorithm known as the Kadane 2D algorithm. This algorithm has a O(n²m) complexity. The sequential algorithm is written using 3 loops : for i in (0..n) // &#60;- We parallelize that for j in (i..n) for k in (0..m) //do work with matrix[j][k] [...]]]></description>
			<content:encoded><![CDATA[
<div>The subarray problem on a n*m matrix is sequentially solved using an algorithm known as the Kadane 2D algorithm. This algorithm has a O(n²m) complexity. The sequential algorithm is written using 3 loops :
      </div>
<pre>
         for i in (0..n)   // &lt;- We parallelize that
		 for j in (i..n)
			 for k in (0..m)
			    //do work with matrix[j][k]
      </pre>
<div>Our solution does not try to optimize the work performed inside the inner loop, so we skip the details of what is actually done inside. We chose to parallelize only the outer loop (index <b>i</b>).</div>
<div>In order to parallelize the outer loop on K cores, we chose to split it into K tasks of equal duration. This approach has several advantages :</p>
<ul>
<li>The algorithm is very simple : there is no need to steal work or do complex load balancing between the K cores.</li>
<li>Each thread works on big continuous portions of the matrix, which maximizes cache usage.</li>
<li>We know in advance what the threads are going to do and which data are going to be accessed so we can do smart NUMA optimizations.</li>
</ul></div>
<div>In this article, we explain: how we achieved to split the work into K equal tasks and how we optimized the treatment of these tasks.</div>
<h2>1-Creating K tasks of equal duration</h2>
<table>
<tr>
<td>
			 <img src="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/splitting.png" style="padding:15px"></img><br />
			 <label><b>Fig. 1</b> - <i>K=4 equal areas in a triangle</i></label>
		</td>
<td style="padding-left:30px">
<div>In order to split a <tt>for i (0..n)</tt> loop into K tasks, one often create K tasks <tt>[i=0..n/K],[i=n/K..2*n/K]...[i=(K-1)*n/K,K]</tt>. However, this simple solution does not work well in our case because the second loop (index <b>j</b>) starts at index <b>i</b>. This means that when <tt>i==0</tt>, <tt>n</tt> iterations are done in the second loop and when <tt>i==n-1</tt> only <tt>1</tt> iteration is done in the second loop! The amount of work depending on <b>i</b> is represented in Figure 1. This figure represents an example of the work to be done on a 250*m matrix. When <tt>i==0</tt>, 250 iterations are done; when <tt>i==250</tt>, only 1 iteration is done. The total quantity of work to be done is equal to the area of the triangle.</div>
<div>Splitting the work into K equal tasks is equivalent to creating K equal areas inside the above mentioned triangle.</div>
<div>For example, in Figure 1, representing the work to be done on a 250*m matrix, a close-to-optimal partionning is the following :</p>
<ul>
<li>Thread 0 doing i (0-34) = 7939 <b>j</b> iterations (area A1)</li>
<li>Thread 1 doing i (34-74) = 7875 <b>j</b> iterations (area A2)</li>
<li>Thread 2 doing i (74-125) = 7860 <b>j</b> iterations (area A3)</li>
<li>Thread 3 doing i (125-250) = 7701 <b>j</b> iterations (area A4)</li>
</ul>
<p>			With this partionning, there is at most a 3% difference in the number of iterations performed by each thread.
		     </p></div>
</td>
</tr>
</table>
<div>
	In order to find the last index that a thread <b>idx</b> should process (e.g., 34 for thread 0 in the above example), we use the following formula:</p>
<pre>
    int last_index = 0;
    do {
	    last_index++;
    } while((last_index)*(n) - (last_index+1)*(last_index)/2 &lt; (idx+1) * n * (n - 1) / 2 / K);
	 </pre>
<p>Where <tt>n</tt> in the number of lines of the matrix, <tt>idx</tt> is the thread number and <tt>K</tt> the number of threads.
      </div>
<div>
	This loop increments <tt>last_index</tt> until the amount of work done between <tt>i=0</tt> and <tt>i=last_index</tt> is equal to <tt>idx*(total-work-to-be-done/number-of-workers)</tt>. The calculation of "the amount of work done" is the calculation of the area of a trapeze. (E.g., on figure 1 the area A1, the work done by thread 0, represents the area of a trapeze.)
    </div>
<div>Actually this could also be calculated with the following formula:</p>
<pre>
    last_index = 2*n - (&radic;<span style="text-decoration:overline">(4*n*n-4*n+1)*K*K+((-4*<b>idx</b>-4)*n*n+(4*<b>idx</b>+4)*n)*K</span>+(2*n-1)*K)</span>/(2*K);
	</pre>
<p>	... but is is actually slower than doing the loop! (We think that the compiler is doing really smart things and that the loop is actually optimized and transformed into a much more efficient formula.)</p>
<h2>2-NUMA optimizations</h2>
<div>As mentioned earlier, we also do NUMA optimizations. <img src='http://software.intel.com/fr-fr/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  In order to improve the locality of the memory accessed by the threads, we have:</p>
<ul>
<li>Created a thread pool per NUMA node in the system. Each thread pool is totally independent from the others. Each thread pool is controlled by a master thread scheduled on the same NUMA node as the pool it controls.</li>
<li>The creation of the K tasks is done in parallel by each master thread (actually each thread creates K/4 tasks since there is 4 NUMA nodes on the MTL).</li>
<li>Before giving the tasks to its workers, each master thread <b>duplicates the matrix on the local NUMA node</b>. This ensures that, when the matrix does not fit in cache, the worker threads fetch data from their local memory. This optimization actually give a <b>+25%</b> performance boost at 40 cores. Lessons learned: pay attention to the data locality. <img src='http://software.intel.com/fr-fr/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li>(Note for those who might think that it is an incredible waste of memory: a 10K*10K matrix occupies 380MB in RAM. The MTL machines has 64GB. So one copy per node = a "waste" of 1.5GB = 2.3% of the memory of the machine = really negligible compared to the gain.)</li>
</ul></div>
<h2>3-Other performance optimizations</h2>
<div>
<ul>
<li>Our approach falls back on the sequential algorithm when the parallel algorithm is considered too costly. (E.g. the cost of duplicating the matrix and managing the thread pool cannot be amortized.)</li>
<li>Since the subarray algorithm is of O(n²m) complexity, it is sometimes worth to transpose the matrix before any computation, in order to have n&lt;m. Experiments showed that transposing becomes worthy as soon as the difference in complexity is above 5K operations.</li>
<li>Both reading and transposing the matrix are done in parallel using our thread pool. The input file is mapped in memory and each reader thread is responsible to parse 800Ko of the input file and creates a partial matrix corresponding to what it has read. All submatrices are then merged using a simple memcpy operation.</li>
</ul></div>
<h2>4-Figure for nerds</h2>
<div>Time to present some results!</div>
<div>
	      <img src="http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/speedup.png" style="padding-bottom:15px"></img><br /><b>Fig 2</b> - <i>Speedup of our algorithm on a 10K*10K matrix</i><br />
              The algorithm has an near optimal speedup between 10 and 40 cores (x3.94) and between 1 and 40 cores (x36.8). This means that, according to Amdhal's law, more than 99.77% of our code is parallel. For those interested, it takes 5.9s at 40 cores to parse a 10K*10K matrix.<br />
	      We think that the speedup seen by the Intel team might have been a little lower due to our static partitionning of data: on the final test 2 cores were fully loaded, which means that our partionning was no longer optimal. Nevertheless our solution seems to have behaved quite nicely even when (intuitively) load balancing could have been required.
     </div>
<p></p>
<h2>5-Code</h2>
<div>Finally, here's a link to <a href='http://software.intel.com/fr-fr/blogs/wordpress/wp-content/uploads/solution.zip'>our code</a></div>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/fr-fr/blogs/2011/11/24/subarray-problem-a-static-numa-aware-approach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction aux &quot;Ranges&quot; des TBB</title>
		<link>http://software.intel.com/fr-fr/blogs/2011/11/22/introduction-aux-ranges-des-tbb/</link>
		<comments>http://software.intel.com/fr-fr/blogs/2011/11/22/introduction-aux-ranges-des-tbb/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 11:10:28 +0000</pubDate>
		<dc:creator>megra</dc:creator>
				<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[programmation parallèle]]></category>
		<category><![CDATA[acceler8]]></category>
		<category><![CDATA[parallel_for]]></category>
		<category><![CDATA[range]]></category>
		<category><![CDATA[TBB]]></category>

		<guid isPermaLink="false">http://software.intel.com/fr-fr/blogs/2011/11/22/introduction-aux-ranges-des-tbb/</guid>
		<description><![CDATA[Bonjour à tous, Je vais vous présenter une fonctionnalité de la bibliothèque TBB que j'ai eu l'occasion de découvrir durant le concours Acceler8. Pour rappel, TBB qui est l'acronyme de "Threading Building Blocks" est une bibliothèque développée par Intel qui vise à faciliter le parallélisme. Rappel sur les TBB L'une des fonctionnalités très appréciée est [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>
<p>Je vais vous présenter une fonctionnalité de la bibliothèque <a href="http://threadingbuildingblocks.org/">TBB</a> que j'ai eu l'occasion de découvrir durant le concours <a href="http://software.intel.com/fr-fr/articles/Acceler8France/">Acceler8</a>.<br />
Pour rappel, <a href="http://threadingbuildingblocks.org/">TBB</a> qui est l'acronyme de "Threading Building Blocks" est une bibliothèque développée par Intel qui vise à faciliter le parallélisme.</p>
<h2>Rappel sur les TBB</h2>
<p>L'une des fonctionnalités très appréciée est le <a href="http://threadingbuildingblocks.org/files/documentation/a00233.html">parallel_for</a>, et ses dérivées tels que le <a href="http://threadingbuildingblocks.org/files/documentation/a00233.html">parallel_reduce</a>.<br />
Ils permettent de paralléliser une boucle très facilement, voici un exemple de code qui parallélise une fonction d'affichage simple, qui pourrait être remplacée par un traitement long et coûteux.</p>
<p>Ainsi le code suivant affiche les entiers de 1 à 41 :<br />
<a href="http://software.intel.com/file/39812">Code source brut</a>.<br />
<a href="http://paste.pocoo.org/show/507007/">Code source avec coloration syntaxique</a>.</p>
<p>Peut être parallélisé ainsi :<br />
<a href="http://software.intel.com/file/39813">Code source brut</a>.<br />
<a href="http://paste.pocoo.org/show/507009/">Code source avec coloration syntaxique</a>.</p>
<p>L'ordre d'affichage est parallélisé, et donc, les nombres ne sont pas dans l'ordre.</p>
<p>Le "range" utilisé ici est le "tbb::blocked_range", qui permet de reproduire les itérations de la boucle. Il suffit de spécifier le "range" et la classe qui effectue le travail, le parallel_for fait tout le reste du travail. La simplicité d'écriture est vite perçue.</p>
<p>Enfin, il est important de noter que le type du range se retrouve dans la méthode de la classe qui surcharge l'opérateur ().</p>
<h2>Rendre notre classe Compute plus modulaire</h2>
<p>Avant d'aller plus, modifions notre classe Compute pour lui faire accepter un "range" de type différent plus facilement. Pour cela, rien de plus simple, il suffit de templater la classe, ce qui nous donne :<br />
<a href="http://software.intel.com/file/39814">Code source brut</a>.<br />
<a href="http://paste.pocoo.org/show/507010/">Code source avec coloration syntaxique</a>.</p>
<p>Avec ce template, il nous suffira de modifier les 2 lignes du main pour changer de "range".</p>
<h2>L'utilité des ranges</h2>
<p>Mais finalement, quelle est l'utilité des ranges ?<br />
C'est simple, ils servent à découper votre problème en sous-problèmes, et permettent après découpage, de lancer les threads sur ces sous-problèmes.</p>
<p>Dans notre cas, nous voulons paralléliser une boucle, et le "tbb::blocked_range" est la méthode parfaite pour faire cela, il découpe l'intervalle demandé (de 1 à 42) en deux, et cela récursivement tant que jugé utile.</p>
<p>Bien sûr, pour des problèmes plus complexes, pour des problèmes entraînant des appels récursifs par exemple, vous ne pourrez pas utiliser bêtement le parallel_for, et il vous faudra chercher du côté de "ranges" ou des "tasks". Nous n'aborderons pas ici les tasks néanmoins.</p>
<h2>Les méthodes à implémenter pour faire une classe "range"</h2>
<p>En parcourant <a href="http://threadingbuildingblocks.org/files/documentation/range_req.html">la documentation</a>, on s'aperçoit que notre classe "range" n'a pas besoin d'hériter d'une classe abstraite, mais doit implémenter certaines méthodes :</p>
<ul>
<li>Un constructeur par copie : R( const R&amp; )</li>
<li>Un constructeur qui découpe le problème en deux : R( R&amp; r, split )</li>
<li>Un destructeur : ~R()</li>
<li>Une méthode qui spécifie si on peut découper le "range" en deux : is_divisible</li>
<li>Une méthode qui spécifie si le "range" courant est vide ou non : empty</li>
</ul>
<h2>Définir son propre range</h2>
<p>Ce qui nous donne le code suivant dans notre cas :<br />
<a href="http://software.intel.com/file/39816">Code source brut</a>.<br />
<a href="http://paste.pocoo.org/show/507016/">Code source avec coloration syntaxique</a>.</p>
<p>Les méthodes très importantes sont : </p>
<ul>
<li>empty : permet de ne pas lancer de calcul sur une morceau vide du problème (après découpage, cela peut arriver).</li>
<li>is_divisible : cela permet de donner une taille minimale à un problème, et de s'assurer qu'il sera effectué par un seul thread. Cela évite le surcoût du lancement de trop de threads. Le paramètre "grain_size" est ainsi utilisé pour limiter s'assurer que le problème envoyé à un thread fait au minium 5 lignes (car pour 11 lignes, on découpe en 5 et 6 lignes).</li>
<li>do_split : qui est introduite dans le code mais n'est pas nécessaire, et qui se charge d'effectuer le découpage du problème en deux sous problèmes. C'est là que toute l'intelligence du découpage doit se faire.</li>
</ul>
<p>Et en intégrant notre "range" personnalisé à notre code précédent cela donne :<br />
<a href="http://software.intel.com/file/39815">Code source brut</a>.<br />
<a href="http://paste.pocoo.org/show/507017/">Code source avec coloration syntaxique</a>.</p>
<p>Vous noterez que la liste d'initialisation du constructeur définit end avant begin, ce qui est impératif à cause du constructeur qui découpe un problème, et de la fonction "do_split", qui modifie "r.end_".</p>
<h2>Remarques sur les performances</h2>
<p>Le découpage en sous-problèmes peut être appelé un nombre conséquent de fois, il est donc important que la fonction de découpage ne soit pas trop longue à s'exécuter.<br />
Pour l'anecdote, sur le concours Acceler8, en voulant découper un problème très équitablement, j'ai utilisé la fonction de calcul de racine carré (sqrt), qui a eu pour conséquence d’augmenter drastiquement le temps de calcul. Ce que je gagnais en répartissant plus équitablement le travail sur les cœurs de la machine, je le perdais en calcul de racine carré. Attention donc à ne pas vous faire avoir.</p>
<h2>Conclusion</h2>
<p>Vous avez vu ici un petit aperçu des "ranges" personnalisés, à vous d'adapter le code à vos besoin : ajouter des paramètres au constructeur, ainsi que découper intelligemment et efficacement.</p>
<h2>Sources :</h2>
<ul>
<li><a href="http://jfkbits.blogspot.com/2007/12/tbbs-parallelfor.html">http://jfkbits.blogspot.com/2007/12/tbbs-parallelfor.html</a></li>
<li><a href="http://threadingbuildingblocks.org/files/documentation/range_req.html">http://threadingbuildingblocks.org/files/documentation/range_req.html</a></li>
<li><a href="http://threadingbuildingblocks.org/files/documentation/a00266.html">http://threadingbuildingblocks.org/files/documentation/a00266.html</a> : il s'agit de l'implémentation du blocked_range. Cela reste une des meilleurs sources de documentation.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/fr-fr/blogs/2011/11/22/introduction-aux-ranges-des-tbb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acceler8 est fini, quelle expérience !</title>
		<link>http://software.intel.com/fr-fr/blogs/2011/08/01/acceler8-est-fini-quelle-exprience/</link>
		<comments>http://software.intel.com/fr-fr/blogs/2011/08/01/acceler8-est-fini-quelle-exprience/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 08:30:47 +0000</pubDate>
		<dc:creator>farcellier</dc:creator>
				<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[ISN France]]></category>
		<category><![CDATA[programmation parallèle]]></category>

		<guid isPermaLink="false">http://software.intel.com/fr-fr/blogs/2011/08/01/acceler8-est-fini-quelle-exprience/</guid>
		<description><![CDATA[Mardi matin, quelle surprise agréable de réceptionner les récompenses du concours acceler8. Ils venaient d'être expédiés la veille. Après 2 mois de travail intensif, c'est donc une page qui se tourne. Le concours acceler8 est bien fini. Ce fut un évènement intense et enrichissant. Nous ne pensions pas quand nous nous sommes lancés dans l'aventure [...]]]></description>
			<content:encoded><![CDATA[<p>Mardi matin, quelle surprise agréable de réceptionner les récompenses du concours acceler8.<br />
Ils venaient d'être expédiés la veille.</p>
<p><img alt="" src="https://lh3.googleusercontent.com/-fHuvZokFgLg/Ti6l9zoCP9I/AAAAAAAAAHI/79t5jEV_z2c/2011-07-26+10.37.40.jpg" class="aligncenter" width="640" height="480" /></p>
<p>Après 2 mois de travail intensif, c'est donc une page qui se tourne. Le concours acceler8 est bien fini. Ce fut un évènement intense et enrichissant. Nous ne pensions pas quand nous nous sommes lancés dans l'aventure que celle-ci nous mènerait si loin.</p>
<p>Le parallélisme est aujourd'hui sur toutes les lèvres. Cependant, nous nous attendions pas à découvrir un univers aussi<br />
riche. Le <a href="http://software.intel.com/fr-fr/articles/acceler8_recherche_nombres_premiers_particuliers_solution/">premier problème</a> sous son apparente simplicité s'est révélé bien plus corsé et pimenté que nous ne l'attendions. Jusqu'à la dernière demi heure, nous n'avons cessé d'y réfléchir et de chercher à améliorer le temps d'exécution de notre programme.</p>
<p>Le <a href="http://software.intel.com/fr-fr/articles/acceler8_recherche_nombres_premiers_particuliers_solution/">second</a>, plus difficile, nous a fait transpiré plus d'une fois. L'expérience du premier s'est révélé formatrice et c'est après un travail de longues haleines que nous sommes parvenus à fournir un programme efficace.</p>
<p>Ces 2 netbooks ne sont pas seulement une récompense. C'est un rappel des efforts que nous avons fourni pour s'améliorer en permanence. C'est aussi un rappel des efforts qu'ils nous restent encore à fournir pour nous améliorer.</p>
<p><img src="https://lh3.googleusercontent.com/-shvjwprfobY/Ti6l9zI2ntI/AAAAAAAAAHM/p0DhyNFnuKA/s640/2011-07-26+12.34.16.jpg" alt="2eme Eeepc du concours acceler8" /></p>
<p>En nous conviant à ce voyage sur le chemin du parallélisme, Intel nous a permis de faire un bout de chemin dans ce domaine. Tout au long de ce défi, ils nous ont guidé sur cette voie. Le partage que ce soit avec les organisateurs ou avec les autres concurrents a rendu cette expérience unique.</p>
<p>J'espère que d'autres défis sur des domaines aussi pointus seront organisés avec la même passion et la même volonté de permettre à<br />
des étudiants de découvrir des domaines parfois laissés en marge des programmes scolaires.</p>
<p>Fabien</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/fr-fr/blogs/2011/08/01/acceler8-est-fini-quelle-exprience/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La description des nouvelles instructions de Haswell</title>
		<link>http://software.intel.com/fr-fr/blogs/2011/06/20/la-description-des-nouvelles-instructions-de-haswell/</link>
		<comments>http://software.intel.com/fr-fr/blogs/2011/06/20/la-description-des-nouvelles-instructions-de-haswell/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 13:00:10 +0000</pubDate>
		<dc:creator>AnthonyC</dc:creator>
				<category><![CDATA[ISN France]]></category>
		<category><![CDATA[programmation parallèle]]></category>
		<category><![CDATA[AVX]]></category>
		<category><![CDATA[Haswell]]></category>

		<guid isPermaLink="false">http://software.intel.com/fr-fr/blogs/2011/06/20/la-description-des-nouvelles-instructions-de-haswell/</guid>
		<description><![CDATA[Intel vient de rendre publique les détails sur la prochaine génération des architectures X86. Arrivant en premier dans nos microarchitectures Intel en 2013 sous le nom de code "Haswell", les nouvelles instructions accèlerent une large catégorie d'applications et de modèles d'usage. Téléchargez la référence de programmation Intel® Advanced Vector Extensions Programming (319433-011). Cette build viendra [...]]]></description>
			<content:encoded><![CDATA[<p>Intel vient de rendre publique les détails sur la prochaine génération des architectures X86. Arrivant en premier dans nos microarchitectures Intel en 2013 sous le nom de code "Haswell", les nouvelles instructions accèlerent une large catégorie d'applications et de modèles d'usage. <a href="http://software.intel.com/file/36945">Téléchargez la référence de programmation  Intel® Advanced Vector Extensions Programming (319433-011)</a>.</p>
<p>Cette build viendra sur les instrutions dans l'architecture Ivy Bridge, incluant le générateur digital de nombre aléatoire, les accelerateurs float16, et étend les extensions de l'Intel Advanced Vector ( Intel AVX) qu'Intel a lancé en 2011. </p>
<p>Ces instructions pourront se partager dans les deux catégories suivantes :</p>
<p><strong>AVX2 -Les types de donnés Entier étendus à 256-bit SIMD</strong>. Le support des entiers AVX2’s est particulièrement utile pour traiter les données visuelles généralement rencontrées dans l'imagerie et dans le traitement de vidéos pour les particulier.  Avec Haswell, nous avons l'Intel® Advanced Vector Extensions (Intel® AVX) pour virgules flottantes, et aussi AVX2 pour les type de données Entier.<br />
<img src="http://software.intel.com/en-us/blogs/wordpress/wp-content/uploads/2011/06/img1.png" alt="instructions" /></p>
<p>Les instructions de manipulations de Bit sont très utiles pour les base de données compressées, le hashing, l'arithmetic des grands nombres, mais aussi une large varieté de code à utilisation plutôt générale.<br />
<img src="http://software.intel.com/en-us/blogs/wordpress/wp-content/uploads/2011/06/img2.png" alt="fze" /></p>
<p>Regroupement des codes de vectorisation avec des éléments de données non-adjacents.<br />
Les rassemblements de Haswell sont masqués pour la sécurité ( comme les charges conditionnelles et les stockages introduits dans Intel AVX ) , ce qui favorise leur utilisation dans des codes avec coupures ou d'autres conditionnelles.<br />
<img src="http://software.intel.com/en-us/blogs/wordpress/wp-content/uploads/2011/06/img3.png" alt="vector" /><br />
<strong>Any-to-Any permutes</strong> – Des opérations de Shuffling incroyablement utiles. Haswell ajoute le support pour la granularité  DWORD et QWORD dans un registre entier de  256-bit.<br />
<img src="http://software.intel.com/en-us/blogs/wordpress/wp-content/uploads/2011/06/img4.png" alt="img" /> </p>
<p><strong>Vector-Vector Shifts</strong>:Nous avons ajouté des déplacements avec le contrôle du déplacement vectoriel. Ils sont critiques dans la vectorisation de boucle avec déplacement variables.<br />
<img src="http://software.intel.com/en-us/blogs/wordpress/wp-content/uploads/2011/06/img5.png" alt="o" /></p>
<p><strong>Floating Point Multiply Accumulate</strong> – Cette fonction  améliore de manière significative les pics de flops et fournit une précision accrue pour l'amélioration de l'usage des mathématiques transcendantes. Elles sont très largement utilisées dans le monde du calcul intensif, dans l'imagerie professionnelle, mais aussi dans la reconnaissance faciale. Ils opèrent sur des , 128-bit packed simple et double précision de type scalar, mais aussi sur des 256-bit packed single et double précision du même  type. [Ces instructions ont été décrites précedemment, dans les spécifications initiales de l'Intel AVX.].<br />
<img src="http://software.intel.com/en-us/blogs/wordpress/wp-content/uploads/2011/06/img6.png" alt="avx" /></p>
<p>Les inscructions vectorisées basées sur l'état de registre étendue ( 256-bit) ajouté dans Intel AVX sont supportées par tous les systèmes qui supportent l'Intel AVX.<br />
Pour les développeurs, il est intéressant de noter que les instructions couvrent plusieurs feuilles CPUID. Vous devriez être prudent de vérifier toutes les bits applicables avant d'utiliser ces instructions.<br />
<a href="http://software.intel.com/file/36945">Veuillez lire les spécifications </a>et restez en ligne pour les outils de support pendant les prochains mois.. </p>
<p>Mark Buxton<br />
Software Engineer<br />
Intel Corporation</p>
<p>( Ceci est la version traduite de l'article originale qui se trouve ici : http://software.intel.com/en-us/blogs/2011/06/13/haswell-new-instruction-descriptions-now-available/ ) </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/fr-fr/blogs/2011/06/20/la-description-des-nouvelles-instructions-de-haswell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meilleures questions autour de la programmation parallèle</title>
		<link>http://software.intel.com/fr-fr/blogs/2011/04/19/meilleures-questions-autour-de-la-programmation-parallle/</link>
		<comments>http://software.intel.com/fr-fr/blogs/2011/04/19/meilleures-questions-autour-de-la-programmation-parallle/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 11:18:25 +0000</pubDate>
		<dc:creator>Anthony Charbonnier (Intel)</dc:creator>
				<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[ISN France]]></category>
		<category><![CDATA[programmation parallèle]]></category>

		<guid isPermaLink="false">http://software.intel.com/fr-fr/blogs/2011/04/19/meilleures-questions-autour-de-la-programmation-parallle/</guid>
		<description><![CDATA[Bonjour à vous Grâce au concours de programmation parallèle, de nombreux threads très intéressants sont apparus sur le forum. Je vais m'efforcer de vous les lister pour les trouver plus rapidement . VinceRev écrit son avis et ses méthodes sur l'accès au cache et l'architecture des processeurs. voir le forum accès au cache et architecture [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à vous </p>
<p>Grâce au concours de programmation parallèle, de nombreux threads très intéressants sont apparus sur le forum.<br />
Je vais m'efforcer de vous les lister pour les trouver plus rapidement .</p>
<p><em>VinceRev</em> écrit son avis et ses méthodes sur l'<strong>accès au cache et l'architecture des processeurs</strong>.<br />
voir le forum <a href="http://software.intel.com/fr-fr/forums/showthread.php?t=82178&amp;o=a&amp;s=lr">accès au cache et architecture des processeurs </a> </p>
<p><em>Shaolan</em> a ouvert un thread sur la <a href="http://software.intel.com/fr-fr/forums/showthread.php?t=82048&amp;o=a&amp;s=lr">découverte d'OpenMP</a> , très intéressant à lire.</p>
<p>Encore <em>Shaolan</em>, pour cette fois une réflexion sur l'<a href="http://software.intel.com/fr-fr/forums/showthread.php?t=82117&amp;o=a&amp;s=lr">optimisation de la programmation<br />
</a></p>
<p>Et enfin, <em>VinceRev</em> nous offre un très bel article sur le temps d'<a href="http://software.intel.com/fr-fr/articles/timer-temps-execution-C/">execution des programmes au niveau du cache</a> .</p>
<p>Ce post sera mis à jour avec les meilleures contributions au fur et à mesure que nos utilisateurs garniront le forum ! </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/fr-fr/blogs/2011/04/19/meilleures-questions-autour-de-la-programmation-parallle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

