<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>INF5171 |</title><link>https://www.jaelgareau.com/fr/tags/inf5171/</link><atom:link href="https://www.jaelgareau.com/fr/tags/inf5171/index.xml" rel="self" type="application/rss+xml"/><description>INF5171</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>fr</language><lastBuildDate>Thu, 14 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://www.jaelgareau.com/media/icon_hu_e954ec168906b2f9.png</url><title>INF5171</title><link>https://www.jaelgareau.com/fr/tags/inf5171/</link></image><item><title>INF5171: Instructions SIMD</title><link>https://www.jaelgareau.com/fr/slides/simd/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://www.jaelgareau.com/fr/slides/simd/</guid><description>&lt;h2 id="instructions-simd"&gt;Instructions SIMD&lt;/h2&gt;
&lt;h3 id="inf5171-programmation-concurrente-et-parallèle"&gt;INF5171: Programmation concurrente et parallèle&lt;/h3&gt;
&lt;hr&gt;
&lt;h3 id="plan-de-cours"&gt;Plan de cours&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Introduction et rappels&lt;/li&gt;
&lt;li&gt;Parallélisme de tâches&lt;/li&gt;
&lt;li&gt;Parallélisme de données&lt;/li&gt;
&lt;li&gt;Hiérarchie de mémoire&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instructions SIMD&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Calcul distribué&lt;/li&gt;
&lt;li&gt;Mesures de performance&lt;/li&gt;
&lt;li&gt;Vérification des programmes parallèles&lt;/li&gt;
&lt;li&gt;Calcul sur processeurs graphiques (GPU)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="version-scalaire"&gt;Version scalaire&lt;/h3&gt;
&lt;p&gt;Hypothèse: &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt; et &lt;code&gt;c&lt;/code&gt; sont des tableaux de &lt;code&gt;float&lt;/code&gt; distincts.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;uint64_t&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="data-parallel-note"&gt;
&lt;ul&gt;
&lt;li&gt;Chaque itération est indépendante&lt;/li&gt;
&lt;li&gt;On peut faire les additions en parallèle&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Parallélisme&lt;br&gt;de données
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Déjà vu: découper le tableau en morceaux et les traiter séparément&lt;/li&gt;
&lt;li&gt;Aujourd&amp;rsquo;hui: paralléliser en utilisant un seul fil d&amp;rsquo;exécution&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;section data-noprocess data-shortcode-slide
data-background-image="/fr/slides/simd/figs/zen4.png"
data-background-position="center"
data-background-repeat="no-repeat"
data-background-size="contain"
&gt;
&lt;hr&gt;
&lt;h3 id="fausse-bonne-idée-matérielle"&gt;Fausse bonne idée matérielle&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ajoutons plus d&amp;rsquo;unités flottantes scalaires dans le coeur.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="mermaid"&gt;flowchart LR
L1i["Cache d'instructions"] --&gt;|"32 o/c; 4 i/c"| Decode["Décodage"]
Decode --&gt;|"6 µops/c"| Schedule["Ordonnancement"]
Schedule --&gt; FPU["Unités flottantes calcul/mémoire"]
&lt;/div&gt;
&lt;span class="fragment " &gt;
&lt;ul&gt;
&lt;li&gt;Il faut décoder/planifier/exécuter plus d&amp;rsquo;instructions par cycle.&lt;/li&gt;
&lt;li&gt;Il faut aussi charger &lt;code&gt;a[i]&lt;/code&gt;, charger &lt;code&gt;b[i]&lt;/code&gt;, puis écrire &lt;code&gt;c[i]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Le débit du flot d&amp;rsquo;instructions est un goulot d&amp;rsquo;étranglement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;
&lt;hr&gt;
&lt;h3 id="un-registre-plusieurs-valeurs"&gt;Un registre, plusieurs valeurs&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Registre scalaire 32 bits
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ float ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span class="fragment " &gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Registre vectoriel 256 bits
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ float ][ float ][ float ][ float ][ float ][ float ][ float ][ float ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/span&gt;
&lt;hr&gt;
&lt;h3 id="une-instruction-plusieurs-opérations"&gt;Une instruction, plusieurs opérations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Augmenter le travail fait &lt;strong&gt;par instruction&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une seule instruction&lt;/strong&gt; effectue plusieurs opérations indépendantes.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code-columns simd-idea"&gt;
&lt;div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [a0 a1 a2 a3 a4 a5 a6 a7] // ymm0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; + [b0 b1 b2 b3 b4 b5 b6 b7] // ymm1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ---------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [c0 c1 c2 c3 c4 c5 c6 c7] // ymm2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;vaddps&lt;/span&gt; &lt;span class="no"&gt;ymm2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ymm0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ymm1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ps&lt;/code&gt;: &lt;em&gt;packed single-precision&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ymm&lt;/code&gt;: registre vectoriel 256 bits&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id="registres-x86-64"&gt;Registres x86-64&lt;/h3&gt;
&lt;table class="register-table"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vue&lt;/th&gt;
&lt;th&gt;Taille&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Année&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;al&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="register-meter"&gt;&lt;span class="register-bar" style="--w: 1"&gt;&lt;/span&gt;&lt;span class="register-size"&gt;1 o&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Intel 8086&lt;/td&gt;
&lt;td&gt;1978&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ax&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="register-meter"&gt;&lt;span class="register-bar" style="--w: 2"&gt;&lt;/span&gt;&lt;span class="register-size"&gt;2 o&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Intel 8086&lt;/td&gt;
&lt;td&gt;1978&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eax&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="register-meter"&gt;&lt;span class="register-bar" style="--w: 4"&gt;&lt;/span&gt;&lt;span class="register-size"&gt;4 o&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;IA-32 (i386)&lt;/td&gt;
&lt;td&gt;1985&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rax&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="register-meter"&gt;&lt;span class="register-bar" style="--w: 8"&gt;&lt;/span&gt;&lt;span class="register-size"&gt;8 o&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;x86-64&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="register-vector-start"&gt;
&lt;td&gt;&lt;code&gt;xmm0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="register-meter"&gt;&lt;span class="register-bar vector" style="--w: 16"&gt;&lt;/span&gt;&lt;span class="register-size"&gt;16 o&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;SSE&lt;/td&gt;
&lt;td&gt;1999&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ymm0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="register-meter"&gt;&lt;span class="register-bar vector" style="--w: 32"&gt;&lt;/span&gt;&lt;span class="register-size"&gt;32 o&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;AVX&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zmm0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="register-meter"&gt;&lt;span class="register-bar vector" style="--w: 64"&gt;&lt;/span&gt;&lt;span class="register-size"&gt;64 o&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;AVX-512&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="register-note"&gt;
&lt;span&gt;&lt;strong&gt;Scalaires&lt;/strong&gt;&lt;br&gt; 16 registres généraux 64 bits&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;SSE/AVX/AVX2&lt;/strong&gt;&lt;br&gt; 16 registres vectoriels&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;AVX-512&lt;/strong&gt;&lt;br&gt; 32 registres vectoriels&lt;/span&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id="ce-que-simd-change"&gt;Ce que SIMD change&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center"&gt;Scalaire&lt;/th&gt;
&lt;th style="text-align: center"&gt;SIMD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;1 addition par instruction&lt;/td&gt;
&lt;td style="text-align: center"&gt;jusqu&amp;rsquo;à 16 opérations &lt;code&gt;float&lt;/code&gt; par instruction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Plusieurs instructions identiques&lt;/td&gt;
&lt;td style="text-align: center"&gt;Une instruction vectorielle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Peu de données par instruction&lt;/td&gt;
&lt;td style="text-align: center"&gt;Plus de travail par instruction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="en-pratique"&gt;En pratique&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Applications typiques:
&lt;ul&gt;
&lt;li&gt;filtres image/audio, compression, simulation, apprentissage machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pour les boucles simples, le compilateur peut générer des instructions SIMD automatiquement.
&lt;ul&gt;
&lt;li&gt;Options utiles: &lt;code&gt;-O3 -march=native&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Condition: prouver l&amp;rsquo;absence de dépendances entre itérations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sinon: réécriture du code, &lt;a href="https://www.openmp.org/spec-html/5.0/openmpsu42.html" target="_blank" rel="noopener"&gt;OpenMP SIMD&lt;/a&gt;
ou &lt;a href="https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html" target="_blank" rel="noopener"&gt;&lt;em&gt;intrinsics&lt;/em&gt;&lt;/a&gt;
.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="version-simd-vectorielle"&gt;Version SIMD (vectorielle)&lt;/h3&gt;
&lt;div class="code-columns"&gt;
&lt;div&gt;
&lt;p&gt;C++ avec &lt;em&gt;intrinsics&lt;/em&gt; AVX&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;uint64_t&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;__m256&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_mm256_loadu_ps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;__m256&lt;/span&gt; &lt;span class="n"&gt;vb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_mm256_loadu_ps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;__m256&lt;/span&gt; &lt;span class="n"&gt;vc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_mm256_add_ps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_mm256_storeu_ps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;vc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;Assembleur x86-64 représentatif&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nl"&gt;.Lloop:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;vmovups&lt;/span&gt; &lt;span class="no"&gt;ymm0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;a&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="no"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;vmovups&lt;/span&gt; &lt;span class="no"&gt;ymm1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;b&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="no"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;vaddps&lt;/span&gt; &lt;span class="no"&gt;ymm2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ymm0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ymm1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;vmovups&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;c&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="no"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="no"&gt;ymm2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;add&lt;/span&gt; &lt;span class="no"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;cmp&lt;/span&gt; &lt;span class="no"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;jl&lt;/span&gt; &lt;span class="no"&gt;.Lloop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id="à-retenir"&gt;À retenir&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SIMD est du parallélisme de données à l&amp;rsquo;intérieur d&amp;rsquo;un coeur.&lt;/li&gt;
&lt;li&gt;Il exploite des opérations identiques sur des données indépendantes.&lt;/li&gt;
&lt;li&gt;Il réduit la pression sur le flot d&amp;rsquo;instructions.&lt;/li&gt;
&lt;li&gt;Le gain réel dépend aussi des accès mémoire.&lt;/li&gt;
&lt;li&gt;Il complète les fils d&amp;rsquo;exécution, il ne les remplace pas.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>