<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[loop unrolling mit variadic Templates möglich?]]></title><description><![CDATA[<p>Hallo,</p>
<p>wenn ich etwas wiederholen möchte und zur compile zeit weiss wie oft,</p>
<p>kann ich statt einer<br />
for (int i = 0; i &lt; wieoft ++ i) machwas(i)<br />
loop<br />
variadic templates benutzen um das auf zu rollen?<br />
sodas es sowas wie<br />
machwas(0)<br />
machwas(1)<br />
machwas(2)<br />
...<br />
wird und der optimizer gegebenenfalls berechungen besser simd optimieren kann</p>
<p>theoretisch muss das ja möglich sein, nur wie geht das?<br />
brauch ich dafür variadic Templates oder bin ich damit am falschen Weg?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320669/loop-unrolling-mit-variadic-templates-möglich</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 15:31:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320669.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Oct 2013 12:33:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 12:33:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wenn ich etwas wiederholen möchte und zur compile zeit weiss wie oft,</p>
<p>kann ich statt einer<br />
for (int i = 0; i &lt; wieoft ++ i) machwas(i)<br />
loop<br />
variadic templates benutzen um das auf zu rollen?<br />
sodas es sowas wie<br />
machwas(0)<br />
machwas(1)<br />
machwas(2)<br />
...<br />
wird und der optimizer gegebenenfalls berechungen besser simd optimieren kann</p>
<p>theoretisch muss das ja möglich sein, nur wie geht das?<br />
brauch ich dafür variadic Templates oder bin ich damit am falschen Weg?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358529</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Mon, 07 Oct 2013 12:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 12:38:08 GMT]]></title><description><![CDATA[<blockquote>
<p>wird und der optimizer gegebenenfalls berechungen besser simd optimieren kann</p>
</blockquote>
<p>Kommt drauf an, eher nicht.</p>
<blockquote>
<p>nur wie geht das</p>
</blockquote>
<p>Indem du Iteration durch Rekursion ersetzt.</p>
<blockquote>
<p>brauch ich dafür variadic Templates oder bin ich damit am falschen Weg</p>
</blockquote>
<p>Du brauchst keine Templates mit variable Argumenten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358531</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 07 Oct 2013 12:38:08 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 12:59:59 GMT]]></title><description><![CDATA[<p>kurze_frage schrieb:</p>
<blockquote>
<p>theoretisch muss das ja möglich sein, nur wie geht das?</p>
</blockquote>
<p>Sicher, allerdings ist es höchstwahrscheinlich kontraproduktiv, d.h. je nach Komplexität ist der erzeugte Code eher geanuso schnell oder langsamer als eine einfache Schleife, deren Optimierung dem Compiler überlassen wurde.</p>
<p>Ein Aufrollen per variadic Template ist nat. möglich.<br />
Erst einmal benötigen wir dafür eine entsprechende Argumentliste, müssen das Ganze also über einen Funktionsaufruf deligieren. Zum Beispiel so:</p>
<pre><code class="language-cpp">// C++14 (N3658)
////////////////
template&lt;class T, T...&gt; struct integer_sequence;
{
    using value_type = T;
    static constexpr size_t size() noexcept { return sizeof...(I); }
};
template&lt;size_t... I&gt;
using index_sequence = integer_sequence&lt;size_t, I...&gt;;

template &lt;typename T, std::size_t N, typename = integer_sequence&lt;&gt;&gt;
struct make_index_sequence_;
template &lt;typename T, std::size_t N, T... I&gt;
struct make_index_sequence_&lt;T, N, integer_sequence&lt;T, I...&gt;&gt;
{
    using type = typename make_index_sequence_&lt;T, N-1, integer_sequence&lt;T, 0, 1+I...&gt;&gt;::type;
};
template &lt;typename T, T... I&gt;
struct make_index_sequence_&lt;T, 0, integer_sequence&lt;T, I...&gt;&gt;
{
    using type = integer_sequence&lt;i...&gt;;
};

template&lt;class T, T N&gt;
using make_integer_sequence = typename make_integer_sequence_&lt;T, N&gt;::type;
template&lt;size_t N&gt;
using make_index_sequence = make_integer_sequence&lt;size_t, N&gt;;
template&lt;class... T&gt;
using index_sequence_for = make_index_sequence&lt;sizeof...(T)&gt;;
/////////////////////////
void machwas(int);
void foo()
{
    constexpr auto wieoft = ...
    for (int i = 0; i &lt; wieoft ++ i)
        machwas(i);
}
// wird zu
template &lt;typename Fun, int... i&gt;
void machwas_N(Fun f, integer_sequence&lt;int, i...&gt;)
{
    bool dummy[] = { f(i)... }; // Ausführungsreihenfolge garantiert
}
void foo()
{
    constexpr auto wieoft = ...
    machwas_N(machwas, make_integer_sequence&lt;int, wieoft&gt;{});
}
</code></pre>
<p>Ich bezweifle aber, das so eine Transformation einer Vektorisierung durch den Compiler zuträglich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358540</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Oct 2013 12:59:59 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 13:07:34 GMT]]></title><description><![CDATA[<p>Wenn die Schleife eine feste Durchlaufzahl hat, dann lohnt sich das nicht - loop unrolling sollte der Compiler doch selbst hinbekommen. Machen die auch.</p>
<p>Übrigens würde man hier vielleicht zu Boost.PP greifen... variadic templates tun es aber auch:</p>
<pre><code>template&lt; void(*)(index_type),
          size_type len,
          typename = eval&lt;make_index_list&lt;len&gt;&gt;&gt; struct repeat;

template&lt; void(*ptr)(index_type), size_type len,
          index_type... indices &gt;
struct repeat&lt;ptr, len, index_list&lt;indices...&gt;&gt;
{
	static void run()
	{
		bool _[]{ (ptr(indices), false)... };
	}
};

void foo(index_type i)
{
	std::cout &lt;&lt; i &lt;&lt; ',';
}

int main()
{
	repeat&lt;foo, 7&gt;::run();
}
</code></pre>
<p>Ausgabe sollte sein:<br />
0,1,2,3,4,5,6<br />
Man kann die Warnung auch entfernen, in dem man eine temporäre <code>initializer_list</code> erzeugt.</p>
<p>War jetzt aber nur zum Spaß.</p>
<p>Edit: <strong>camper</strong>! Verdammt, ich bin zu spät <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358542</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:07:34 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 13:12:19 GMT]]></title><description><![CDATA[<ul>
<li>schrieb:</li>
</ul>
<blockquote>
<p>Edit: <strong>camper</strong>! Verdammt, ich bin zu spät <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
</blockquote>
<p>Dafür hat sich bei mir ein offensichtlicher Fehler eingeschlichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358546</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 13:17:17 GMT]]></title><description><![CDATA[<p><a href="https://ideone.com/jxX6pW" rel="nofollow">https://ideone.com/jxX6pW</a></p>
<blockquote>
<p>Dafür hat sich bei mir ein offensichtlicher Fehler eingeschlichen.</p>
</blockquote>
<p>Ja, das Array hat falsche initializer.</p>
<p>Man sollte meines noch ändern zu</p>
<pre><code>template&lt; size_type len, 
          typename = eval&lt;make_index_list&lt;len&gt;&gt;&gt; struct repeat;

template&lt; size_type len, index_type... indices &gt;
struct repeat&lt;len, index_list&lt;indices...&gt;&gt; // Edit: template-id korrigiert
{
    template&lt; typename Fun &gt;
    static void run(Fun f)
    {
        bool _[]{ (f(indices), false)... };
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2358548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358548</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:17:17 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 13:18:13 GMT]]></title><description><![CDATA[<p>Edit: Hat sich erledigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358549</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:18:13 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 13:52:03 GMT]]></title><description><![CDATA[<p>das Template mit der Index Liste finde ich interessant,<br />
werde aber einige Zeit brauchen um das zu verstehen.<br />
Danke!</p>
<p>Boost.PP ist boost Preprocessor?</p>
<p>bezügleich das der Compiler loops selst aufrollt und optimiert</p>
<p>Bsp: data und data1 ist ein array und sagen wir size = 4</p>
<p>for (int i=0; i&lt;data.size(); i++)<br />
{<br />
sum += data[i] + data1[i];<br />
}</p>
<p>der Compiler macht automatisch so oder so ähnlich/besser?</p>
<p>int sum1 = data[0] + data1[0];<br />
int sum2 = data[1] + data1[1];<br />
int sum3 = data[2] + data1[2];<br />
int sum4 = data[3] + data1[3];<br />
int sum = sum1 + sum2 + sum3 + sum4;</p>
<p>kann man sich darauf verlassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358557</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:52:03 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 13:54:59 GMT]]></title><description><![CDATA[<blockquote>
<p>kann man sich darauf verlassen?</p>
</blockquote>
<p>Nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358559</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:54:59 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 14:16:53 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>kann man sich darauf verlassen?</p>
</blockquote>
<p>Nein.</p>
</blockquote>
<p>dachte ich mir,<br />
desswegen dachte ich mir das mir vielleicht ein Template helfen könnte.<br />
aber oben wurde geschrieben das es nicht besser sondern eher vielleicht schlechter wird.<br />
dh ich werde wohl, das array Bsp hernehmend, jede Array grösse extra implementieren müssen oder mit einer loop leben müssen die u.U. nicht optimal implementiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358567</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Mon, 07 Oct 2013 14:16:53 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 14:18:37 GMT]]></title><description><![CDATA[<p>kurze_frage schrieb:</p>
<blockquote>
<p>der Compiler macht automatisch so oder so ähnlich/besser?</p>
<p>int sum1 = data[0] + data1[0];<br />
int sum2 = data[1] + data1[1];<br />
int sum3 = data[2] + data1[2];<br />
int sum4 = data[3] + data1[3];<br />
int sum = sum1 + sum2 + sum3 + sum4;</p>
</blockquote>
<p>Wenn man ihm die entsprechenden Optimierungsoptionen mitgibt.</p>
<p>Beispiel</p>
<pre><code class="language-cpp">constexpr int size = 1000;

int data[size];
int data1[size];

int foo()
{
    int sum = 0;
    for (int i=0; i&lt;size; i++)
    {
        sum += data[i] + data1[i];
    }
    return sum;
}

#include &lt;iostream&gt;
#include &lt;ctime&gt;

int main()
{
    std::srand(std::time(0));
    for (int i=0; i&lt;size; i++)
    {
        data[i] = rand();
        data1[i] = rand();
    }
    std::cout &lt;&lt; foo() &lt;&lt; '\n';
}
</code></pre>
<p>gcc-4.8.1 mit -O2 (nur der interessante Teil der Schleife)</p>
<pre><code class="language-asm">.L3:
        addl    (%rsi,%rdx), %eax
        addl    (%rcx,%rdx), %eax
        addq    $4, %rdx
        cmpq    $4000, %rdx
        jne     .L3
</code></pre>
<p>kein Unrolling, keine Vektorisierung<br />
zusätzlich -ftree-vectorize (durch -O3 impliziert)</p>
<pre><code class="language-asm">.L3:
        paddd   (%rcx,%rax), %xmm0
        paddd   (%rdx,%rax), %xmm0
        addq    $16, %rax
        cmpq    $4000, %rax
        jne     .L3
</code></pre>
<p>zusätzlich -funroll-loops</p>
<pre><code class="language-asm">.L3:
        paddd   (%rcx,%rax), %xmm0
        paddd   (%rdx,%rax), %xmm0
        paddd   16(%rcx,%rax), %xmm0
        paddd   16(%rdx,%rax), %xmm0
        paddd   32(%rcx,%rax), %xmm0
        paddd   32(%rdx,%rax), %xmm0
        paddd   48(%rcx,%rax), %xmm0
        paddd   48(%rdx,%rax), %xmm0
        paddd   64(%rcx,%rax), %xmm0
        paddd   64(%rdx,%rax), %xmm0
        paddd   80(%rcx,%rax), %xmm0
        paddd   80(%rdx,%rax), %xmm0
        paddd   96(%rcx,%rax), %xmm0
        paddd   96(%rdx,%rax), %xmm0
        paddd   112(%rcx,%rax), %xmm0
        paddd   112(%rdx,%rax), %xmm0
        paddd   128(%rcx,%rax), %xmm0
        paddd   128(%rdx,%rax), %xmm0
        paddd   144(%rcx,%rax), %xmm0
        paddd   144(%rdx,%rax), %xmm0
        addq    $160, %rax
        cmpq    $4000, %rax
        jne     .L3
</code></pre>
<p>zusätzlich -march=corei7-avx</p>
<pre><code class="language-asm">.L3:
        vpaddd  (%rcx,%rax), %xmm3, %xmm0
        vpaddd  (%rdx,%rax), %xmm0, %xmm1
        vpaddd  16(%rcx,%rax), %xmm1, %xmm2
        vpaddd  16(%rdx,%rax), %xmm2, %xmm3
        vpaddd  32(%rcx,%rax), %xmm3, %xmm4
        vpaddd  32(%rdx,%rax), %xmm4, %xmm5
        vpaddd  48(%rcx,%rax), %xmm5, %xmm6
        vpaddd  48(%rdx,%rax), %xmm6, %xmm7
        vpaddd  64(%rcx,%rax), %xmm7, %xmm8
        vpaddd  64(%rdx,%rax), %xmm8, %xmm9
        vpaddd  80(%rcx,%rax), %xmm9, %xmm10
        vpaddd  80(%rdx,%rax), %xmm10, %xmm11
        vpaddd  96(%rcx,%rax), %xmm11, %xmm12
        vpaddd  96(%rdx,%rax), %xmm12, %xmm13
        vpaddd  112(%rcx,%rax), %xmm13, %xmm14
        vpaddd  112(%rdx,%rax), %xmm14, %xmm15
        vpaddd  128(%rcx,%rax), %xmm15, %xmm0
        vpaddd  128(%rdx,%rax), %xmm0, %xmm1
        vpaddd  144(%rcx,%rax), %xmm1, %xmm2
        vpaddd  144(%rdx,%rax), %xmm2, %xmm3
        addq    $160, %rax
        cmpq    $4000, %rax
        jne     .L3
</code></pre>
<p>Dieses einfache Beispiel ist für den Compiler kein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358568</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Oct 2013 14:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 14:32:01 GMT]]></title><description><![CDATA[<p>Wobei ich jetzt mal die Geschwindigkeit des funroll-loops mit dem O3 vergleichen würde. Es ist nämlich nicht immer die beste Idee, alle Schleifen abzurollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358576</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 07 Oct 2013 14:32:01 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 14:34:36 GMT]]></title><description><![CDATA[<p>Mit</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
// C++14 (N3658)
////////////////
template&lt;class T, T... I&gt; struct integer_sequence
{
    using value_type = T;
    static constexpr size_t size() noexcept { return sizeof...(I); }
};
template&lt;size_t... I&gt;
using index_sequence = integer_sequence&lt;size_t, I...&gt;;

template &lt;typename T, std::size_t N, typename = integer_sequence&lt;T&gt;&gt;
struct make_integer_sequence_;
template &lt;typename T, std::size_t N, T... I&gt;
struct make_integer_sequence_&lt;T, N, integer_sequence&lt;T, I...&gt;&gt;
{
    using type = typename make_integer_sequence_&lt;T, N-1, integer_sequence&lt;T, 0, 1+I...&gt;&gt;::type;
};
template &lt;typename T, T... I&gt;
struct make_integer_sequence_&lt;T, 0, integer_sequence&lt;T, I...&gt;&gt;
{
    using type = integer_sequence&lt;T, I...&gt;;
};

template&lt;class T, T N&gt;
using make_integer_sequence = typename make_integer_sequence_&lt;T, N&gt;::type;
template&lt;size_t N&gt;
using make_index_sequence = make_integer_sequence&lt;size_t, N&gt;;
template&lt;class... T&gt;
using index_sequence_for = make_index_sequence&lt;sizeof...(T)&gt;;
/////////////////////////

constexpr int size = 1000;

int data[size];
int data1[size];

template &lt;int... i&gt;
int foo_N(integer_sequence&lt;int, i...&gt;)
{
    int sum = 0;
    bool dummy[] = { ((sum+=data[i]+data1[i]),false)... };
    return sum;
}

int foo()
{
    return foo_N(make_integer_sequence&lt;int,size&gt;{});
}

#include &lt;iostream&gt;
#include &lt;ctime&gt;

int main()
{
    std::srand(std::time(0));
    for (int i=0; i&lt;size; i++)
    {
        data[i] = rand();
        data1[i] = rand();
    }
    std::cout &lt;&lt; foo() &lt;&lt; '\n';
}
</code></pre>
<p>-O2 -ftemplate-depth=2000</p>
<pre><code class="language-asm">movl    data(%rip), %eax
        addl    data1(%rip), %eax
        addl    4+data(%rip), %eax
        addl    4+data1(%rip), %eax
        addl    8+data(%rip), %eax
        addl    8+data1(%rip), %eax
        addl    12+data(%rip), %eax
        addl    12+data1(%rip), %eax
... usw.
        addl    3996+data(%rip), %eax
        addl    3996+data1(%rip), %eax
        movq    -8(%rbp), %rdx
        xorq    %fs:40, %rdx
        jne     .L5
</code></pre>
<p>Ich bin nicht ganz sicher, wie viel Speicher eine einzelne add-Instruktion hier braucht (5 oder 6 schätze ich mal), auf jedenfall ist das eine Menge Code, der ggf. nicht mehr in den L1-Cache passt.</p>
<p>zusätzlich -ftree-vectorize</p>
<pre><code class="language-asm">movl    data(%rip), %eax
        addl    data1(%rip), %eax
        addl    4+data(%rip), %eax
        addl    4+data1(%rip), %eax
        addl    8+data(%rip), %eax
        addl    8+data1(%rip), %eax
        addl    12+data(%rip), %eax
        addl    12+data1(%rip), %eax
... usw.
</code></pre>
<p>Schlecht! Keine Vectorisierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358577</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Oct 2013 14:34:36 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 14:35:46 GMT]]></title><description><![CDATA[<p>wow, super interessante Information, vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358582</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Mon, 07 Oct 2013 14:35:46 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 14:58:13 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">constexpr int size = 1000;
</code></pre>
<p>Hmm, und jetzt, wenn die Feldgroesse keine fixe Groesse ist. Aber sicherlich ist das Beispiel viel zu einfach.</p>
<pre><code class="language-cpp">paddd   (%rcx,%rax), %xmm0
</code></pre>
<p>Hmm, noch nie gesehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Sehr interessante Syntax, 2 64 Bitregister zusammenzufassen und mit einem XMM-Register zu verheiraten. Wo kann ich mehr darueber nachlesen? Gibt es dafuer Intrinsics? Geht das auch andersherum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358587</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 07 Oct 2013 14:58:13 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 14:53:39 GMT]]></title><description><![CDATA[<blockquote>
<p>-ftemplate-depth=2000</p>
</blockquote>
<p>Wozu? Braucht es tatsächlich 2000 rekursive Instantiierungen? (Oder gibst du das standardmäßig an?)</p>
<blockquote>
<p>Dieses einfache Beispiel ist für den Compiler kein Problem.</p>
</blockquote>
<p>Und was geschieht, wenn du -Os mitgibst?</p>
<blockquote>
<p>Boost.PP ist boost Preprocessor?</p>
</blockquote>
<p>Richtig. Wenn die Anzahl Schleifendurchläufe ein Literal ist, dann geht es damit. (Damit wird aber der Code möglicherweise recht lang)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358590</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 07 Oct 2013 14:53:39 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 14:56:50 GMT]]></title><description><![CDATA[<blockquote>
<p>Hmm, und jetzt, wenn die Feldgroesse keine fixe Groesse ist.</p>
</blockquote>
<p>Keine fixe Größe? Reden wir jetzt von VLAs?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358591</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 07 Oct 2013 14:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 15:00:22 GMT]]></title><description><![CDATA[<p>Nein, std::vector&lt;int&gt; tuts auch. Glaube Intel versucht SSE bei valarray ... zumindestens habe ich mal was gelesen ... lange her.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358593</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 07 Oct 2013 15:00:22 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 15:04:01 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<pre><code class="language-cpp">paddd   (%rcx,%rax), %xmm0
</code></pre>
<p>Hmm, noch nie gesehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Sehr interessante Syntax, 2 64 Bitregister zusammenzufassen und mit einem XMM-Register zu verheiraten. Wo kann ich mehr darueber nachlesen? Gibt es dafuer Intrinsics? Geht das auch andersherum?</p>
</blockquote>
<p>das ist AT&amp;T-Syntax für Speicheroperanden. Bei intel sieht das so aus</p>
<pre><code class="language-asm">paddd xmm0, [rcx+rax]
</code></pre>
<p>allgemein<br />
disp(base_reg,index_reg,scale) entspricht [base_reg+index_reg*scale+disp]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358594</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Oct 2013 15:04:01 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 15:04:20 GMT]]></title><description><![CDATA[<p>Ach verdammt ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358595</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 07 Oct 2013 15:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 15:08:12 GMT]]></title><description><![CDATA[<p>1. Code mit -Os ergibt</p>
<pre><code class="language-asm">.L3:
        leaq    data(%rip), %rcx
        addl    (%rcx,%rdx), %eax
        leaq    data1(%rip), %rcx
        addl    (%rcx,%rdx), %eax
        addq    $4, %rdx
        cmpq    $4000, %rdx
        jne     .L3
</code></pre>
<p>-ftree-vectorize und -funroll-loops führen zu keiner Änderung (ausser vertauschter Reihenfolge der 2. und 3. Instruktion mit -funroll-loops)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358600</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Oct 2013 15:08:12 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling mit variadic Templates möglich? on Mon, 07 Oct 2013 15:16:11 GMT]]></title><description><![CDATA[<ul>
<li>schrieb:</li>
</ul>
<blockquote>
<blockquote>
<p>-ftemplate-depth=2000</p>
</blockquote>
<p>Wozu? Braucht es tatsächlich 2000 rekursive Instantiierungen? (Oder gibst du das standardmäßig an?)</p>
</blockquote>
<p>Habe 2000 angegeben, es mehr als 1000 sein müssen bei dieser primitiven Art der Generierung von make_integer_sequence.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358603</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Oct 2013 15:16:11 GMT</pubDate></item></channel></rss>