<?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[SSE Vector Klasse (SIMD Optimierung)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich probiere seit einiger Zeit mit SSE Optimierung rum. Dazu habe ich 2 Vector Klassen geschrieben. Eine mit SSE Optimierung und eine ohne. Bei der SSE Optimierung nutze ich die &lt;xmmintrin.h&gt; Intrinsics. Als Compiler verwende ich den gcc in Version 4.1 und das ganze unter Linux. In beiden Klassen sind die Operatoren (+, -, *, /) jeweils als inline deklariert.</p>
<p>Funktionieren tun beide Klassen aber mir ist folgendes aufgefallen.</p>
<p>Wenn ich beide Klassen im gcc mit -O2 optimiere sind diese gleich schnell. Deaktiviere ich im gcc die automatische Optimierung (-O0) so ist die SSE optimierte Vector Klasse wesentlich schneller.</p>
<p>Als Laie würde ich jetzt daraus schliessen, dass der Compiler automatisch SSE optimiert aber das glaube ich auch nicht so recht?</p>
<p>Ich verwende den Datentyp __m128 und dieser sollte ja vom Compiler automatisch 16 Bit aligned angelegt werden. Muss ich dann in der Klasse auch nochmal 16 Bit alignment definieren?</p>
<p>Ich bin für jeden Hinweis dankbar wo ich da ansetzen kann.</p>
<p>MfG, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171258/sse-vector-klasse-simd-optimierung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Jul 2026 20:20:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171258.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Jan 2007 21:42:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SSE Vector Klasse (SIMD Optimierung) on Tue, 23 Jan 2007 21:42:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich probiere seit einiger Zeit mit SSE Optimierung rum. Dazu habe ich 2 Vector Klassen geschrieben. Eine mit SSE Optimierung und eine ohne. Bei der SSE Optimierung nutze ich die &lt;xmmintrin.h&gt; Intrinsics. Als Compiler verwende ich den gcc in Version 4.1 und das ganze unter Linux. In beiden Klassen sind die Operatoren (+, -, *, /) jeweils als inline deklariert.</p>
<p>Funktionieren tun beide Klassen aber mir ist folgendes aufgefallen.</p>
<p>Wenn ich beide Klassen im gcc mit -O2 optimiere sind diese gleich schnell. Deaktiviere ich im gcc die automatische Optimierung (-O0) so ist die SSE optimierte Vector Klasse wesentlich schneller.</p>
<p>Als Laie würde ich jetzt daraus schliessen, dass der Compiler automatisch SSE optimiert aber das glaube ich auch nicht so recht?</p>
<p>Ich verwende den Datentyp __m128 und dieser sollte ja vom Compiler automatisch 16 Bit aligned angelegt werden. Muss ich dann in der Klasse auch nochmal 16 Bit alignment definieren?</p>
<p>Ich bin für jeden Hinweis dankbar wo ich da ansetzen kann.</p>
<p>MfG, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215604</guid><dc:creator><![CDATA[timbo]]></dc:creator><pubDate>Tue, 23 Jan 2007 21:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to SSE Vector Klasse (SIMD Optimierung) on Tue, 23 Jan 2007 22:09:55 GMT]]></title><description><![CDATA[<p>timbo schrieb:</p>
<blockquote>
<p>Als Laie würde ich jetzt daraus schliessen, dass der Compiler automatisch SSE optimiert aber das glaube ich auch nicht so recht?</p>
</blockquote>
<p>Das tun die neueren Compiler (VC7.1/8.0 und die neuen GCC) soweit ich weiss wirklich. Wie meistens solltest du das Optimieren dem Compiler überlassen, ausser wenn du wirklich weisst, was du tust.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215621</guid><dc:creator><![CDATA[Antwort]]></dc:creator><pubDate>Tue, 23 Jan 2007 22:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to SSE Vector Klasse (SIMD Optimierung) on Tue, 23 Jan 2007 22:14:12 GMT]]></title><description><![CDATA[<p>nunja, man lernt ja nie aus.</p>
<p>Ich habe mich schon mit dem Thema SSE (bzw. SIMD) befasst. Jedoch hat mich dieses Ergebnis nun doch etwas verwundert. Das Laie war eher auf das Thema SSE bezogen.</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215624</guid><dc:creator><![CDATA[timbo]]></dc:creator><pubDate>Tue, 23 Jan 2007 22:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to SSE Vector Klasse (SIMD Optimierung) on Tue, 23 Jan 2007 23:42:46 GMT]]></title><description><![CDATA[<p>ohne mit dem profiler drueber zu gehen ist es nicht moeglich zu sagen was das limitierende fuer deinen benchmark ist. Heutzutage ist es oft das RAM, da kann man soviel SSE MMX ALTIVEC coden wie man will, vom 'unwissendem' angewendet ist es pures glueck wenn es vorteile bringt.</p>
<p>btw. und was passiert bei -o3? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215646</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Tue, 23 Jan 2007 23:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to SSE Vector Klasse (SIMD Optimierung) on Wed, 24 Jan 2007 03:09:31 GMT]]></title><description><![CDATA[<p>hi timbo,<br />
poste mal deine 2 vector klassen....moechte auch mal die ergebnisse vergleichen und rumspielen...</p>
<p>cu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215672</guid><dc:creator><![CDATA[linuxfreak]]></dc:creator><pubDate>Wed, 24 Jan 2007 03:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to SSE Vector Klasse (SIMD Optimierung) on Wed, 24 Jan 2007 06:56:23 GMT]]></title><description><![CDATA[<p>timbo schrieb:</p>
<blockquote>
<p>Als Laie würde ich jetzt daraus schliessen, dass der Compiler automatisch SSE optimiert aber das glaube ich auch nicht so recht?</p>
</blockquote>
<p>Prüfe es doch nach. Einfach Compilerflag -S angeben und Assembler Listing anschauen (-masm=intel oder -masm=att (default) für Dialekt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215698</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 24 Jan 2007 06:56:23 GMT</pubDate></item><item><title><![CDATA[Reply to SSE Vector Klasse (SIMD Optimierung) on Wed, 24 Jan 2007 09:41:52 GMT]]></title><description><![CDATA[<p>Oder disassemblieren mit:</p>
<pre><code>objdump -d PROGRAMM
</code></pre>
<p>Ich habe auch schon mit inline SSE Assembler rumgespielt und festgestellt dass sich die SSE Optimierung einer Vektorklasse nicht lohnt. Bei Matrix sieht das wiederum anders aus, da bringt es einiges.</p>
<p>Um rauszufinden ob und wie viele SSE instruktionen der Compiler erzeugt hat<br />
hilft die Zeile:</p>
<pre><code>objdump -d PROGRAMM | grep xmm | wc -l
</code></pre>
<p>Kann man als so ne art Pseudometrik verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215779</guid><dc:creator><![CDATA[__HIRSCH_H__]]></dc:creator><pubDate>Wed, 24 Jan 2007 09:41:52 GMT</pubDate></item><item><title><![CDATA[Reply to SSE Vector Klasse (SIMD Optimierung) on Wed, 24 Jan 2007 09:52:09 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=403" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=8" rel="nofollow">Rund um die Programmierung</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215794</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 24 Jan 2007 09:52:09 GMT</pubDate></item><item><title><![CDATA[Reply to SSE Vector Klasse (SIMD Optimierung) on Wed, 24 Jan 2007 17:46:49 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für die Hinweise. Der Tipp mit dem Assembler anschauen war ganz hilfreich. Ohne automatische Compiler-Optimierung (-O0) sind dort Instruktionen zu finden welche auf dem SSE Register (xmm) ausgeführt werden. Sobald ich jedoch den Compiler optimieren lassen, sind dort keine SSE Register (xmm) mehr zu finden. Wenn ich das ganze mit dem ICC (7.1) compiliere sind in beiden Fällen noch SSE Register zu finden.</p>
<p>Hier mal meine (vereinfachten) Vector-Klassen:</p>
<p>Vector.h</p>
<pre><code>class Vector
{
	public:
		float x, y, z;

		Vector() { this-&gt;x = 0; this-&gt;y = 0; this-&gt;z = 0; };
		Vector(const float x, const float y, const float z) { this-&gt;x = x; this-&gt;y = y; this-&gt;z = z; };
};

// +
static inline Vector operator + (const Vector &amp;v1, const Vector &amp;v2)
{
	return Vector( v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
}

// -
static inline Vector operator - (const Vector &amp;v1, const Vector &amp;v2)
{
	return Vector( v1.x - v2.x, v1.y - v2.y, v1.z - v2.z );
}

// *
static inline Vector operator * (const Vector &amp;v1, const Vector v2)
{
	return Vector( v1.x*v2.x, v1.y*v2.y, v1.z*v2.z );
}

// /
static inline Vector operator / (const Vector &amp;v1, const Vector v2)
{
	return Vector( v1.x/v2.x, v1.y/v2.y, v1.z/v2.z );
}
</code></pre>
<p>VectorSSE:</p>
<pre><code>#include &lt;xmmintrin.h&gt;

class VectorSSE
{
	public:	
		__m128 vector;

		VectorSSE() { vector = _mm_set_ps1(0.0f); }
		VectorSSE(__m128 m128)	{ vector = m128;}
		VectorSSE(const float x, const float y, const float z) { vector = _mm_set_ps(x, y, z, 0.0f); }
};

// +
static inline VectorSSE operator + (const VectorSSE &amp;v1, const VectorSSE &amp;v2)
{
	return VectorSSE( _mm_add_ps(v1.vector, v2.vector) );
}

// -
static inline VectorSSE operator - (const VectorSSE &amp;v1, const VectorSSE &amp;v2)
{
	return VectorSSE( _mm_sub_ps(v1.vector, v2.vector) );
}

// *
static inline VectorSSE operator * (const VectorSSE &amp;v1, const VectorSSE &amp;v2)
{
	return VectorSSE( _mm_mul_ps(v1.vector, v2.vector) );
}

// /
static inline VectorSSE operator / (const VectorSSE &amp;v1, const VectorSSE &amp;v2)
{
	return VectorSSE( _mm_div_ps(v1.vector, v2.vector) );
}
</code></pre>
<p>Uns hier mein Test:</p>
<pre><code>// create timer
	Timer timer = Timer();

	// test 1
	//   without sse
	timer.start();
	Vector result1 = Vector(0, 0, 0);
	for(int i = 0; i &lt; ITERATIONS; ++i)
	{
		result1 = result1 + Vector( rand(), rand(), rand() );
		result1 = result1 - Vector( rand(), rand(), rand() );	
		result1 = result1 * Vector( rand(), rand(), rand() );	
		result1 = result1 / Vector( rand(), rand(), rand() );				
	}
	timer.stop();
	timer.printResult(&quot;test 1 (without sse2)&quot;);

	// test 2
	//   with sse
	timer.start();	
	VectorSSE result2 = VectorSSE(0, 0, 0);
	for(int i = 0; i &lt; ITERATIONS; ++i)
	{
		result2 = result2 + VectorSSE( rand(), rand(), rand() );
		result2 = result2 - VectorSSE( rand(), rand(), rand() );
		result2 = result2 * VectorSSE( rand(), rand(), rand() );
		result2 = result2 / VectorSSE( rand(), rand(), rand() );				
	}
	timer.stop();
	timer.printResult(&quot;test 2 (with sse)&quot;);
</code></pre>
<p>Gibt es noch eine Möglichkeit sich das Alignment anzuschaun?</p>
<p>Grüße, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216224</guid><dc:creator><![CDATA[timbo]]></dc:creator><pubDate>Wed, 24 Jan 2007 17:46:49 GMT</pubDate></item></channel></rss>