<?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[Vektor Klasse mit SSE optimierung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir eine Vektor Klasse mit SSE Optimierung geschrieben. Das ganze funktioniert soweit auch. Nur wenn ich diese in einem Objekt auf dem Heap benutzen will, welches mit new angelegt wird, gibt es einen Segfault.</p>
<p>Die Vektor Klasse</p>
<pre><code class="language-cpp">#include &lt;xmmintrin.h&gt;

class Vector
{
	public:		
		Vector();
		Vector(const __m128&amp; m);
		Vector(const float w, const float x, const float y, const float z);

		union
    	{
       		__m128 m128;
        	struct { float w, x, y, z; };        	
    	};
};

inline Vector operator + (const Vector &amp;vector1, const Vector &amp;vector2)
{
	return Vector( _mm_add_ps(vector1.m128, vector2.m128) );
}

inline Vector operator - (const Vector &amp;vector1, const Vector &amp;vector2)
{
	return Vector( _mm_sub_ps(vector1.m128, vector2.m128) );
}

Vector::Vector()
{
	m128 = _mm_setzero_ps();
}

Vector::Vector(const __m128&amp; m)
{
	m128 = m;
}

Vector::Vector(const float w, const float x, const float y, const float z)
{
	m128 = _mm_set_ps(w, z, y, x);
}
</code></pre>
<p>Die Testklasse</p>
<pre><code class="language-cpp">#include &quot;Vector.h&quot;

class Test
{
public:
	Vector v;
	Test(const float w, const float x, const float y, const float z);

};

Test::Test(const float w, const float x, const float y, const float z)
{
	v = Vector(w, x, y, z);
}
</code></pre>
<p>Und die Main:</p>
<pre><code class="language-cpp">#include &quot;Test.h&quot;
#include &lt;iostream&gt;

int main(int argc, char** argv)
{
	Test temp1 = Test(1.0, 2.0, 3.0, 4.0);
	std::cout &lt;&lt; temp1.v.w &lt;&lt; temp1.v.x &lt;&lt; temp1.v.y &lt;&lt; temp1.v.z &lt;&lt; std::endl;

	Test* temp2 = new Test(1.0, 2.0, 3.0, 4.0);
	std::cout &lt;&lt; temp2-&gt;v.w &lt;&lt; temp2-&gt;v.x &lt;&lt; temp2-&gt;v.y &lt;&lt; temp2-&gt;v.z &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>In der Main wird erstiges (Test temp1 = Test ...) noch ausgefürt doch wenn ich das Testobjekt auf den Heap anlege mit (Test* temp2 = new Test ...) gibt es einen Segfault.</p>
<p>Hat jemand eine Idee woran das liegen kann?</p>
<p>Gruß, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/130496/vektor-klasse-mit-sse-optimierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 17:11:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/130496.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Dec 2005 15:17:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Fri, 23 Dec 2005 15:17:19 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir eine Vektor Klasse mit SSE Optimierung geschrieben. Das ganze funktioniert soweit auch. Nur wenn ich diese in einem Objekt auf dem Heap benutzen will, welches mit new angelegt wird, gibt es einen Segfault.</p>
<p>Die Vektor Klasse</p>
<pre><code class="language-cpp">#include &lt;xmmintrin.h&gt;

class Vector
{
	public:		
		Vector();
		Vector(const __m128&amp; m);
		Vector(const float w, const float x, const float y, const float z);

		union
    	{
       		__m128 m128;
        	struct { float w, x, y, z; };        	
    	};
};

inline Vector operator + (const Vector &amp;vector1, const Vector &amp;vector2)
{
	return Vector( _mm_add_ps(vector1.m128, vector2.m128) );
}

inline Vector operator - (const Vector &amp;vector1, const Vector &amp;vector2)
{
	return Vector( _mm_sub_ps(vector1.m128, vector2.m128) );
}

Vector::Vector()
{
	m128 = _mm_setzero_ps();
}

Vector::Vector(const __m128&amp; m)
{
	m128 = m;
}

Vector::Vector(const float w, const float x, const float y, const float z)
{
	m128 = _mm_set_ps(w, z, y, x);
}
</code></pre>
<p>Die Testklasse</p>
<pre><code class="language-cpp">#include &quot;Vector.h&quot;

class Test
{
public:
	Vector v;
	Test(const float w, const float x, const float y, const float z);

};

Test::Test(const float w, const float x, const float y, const float z)
{
	v = Vector(w, x, y, z);
}
</code></pre>
<p>Und die Main:</p>
<pre><code class="language-cpp">#include &quot;Test.h&quot;
#include &lt;iostream&gt;

int main(int argc, char** argv)
{
	Test temp1 = Test(1.0, 2.0, 3.0, 4.0);
	std::cout &lt;&lt; temp1.v.w &lt;&lt; temp1.v.x &lt;&lt; temp1.v.y &lt;&lt; temp1.v.z &lt;&lt; std::endl;

	Test* temp2 = new Test(1.0, 2.0, 3.0, 4.0);
	std::cout &lt;&lt; temp2-&gt;v.w &lt;&lt; temp2-&gt;v.x &lt;&lt; temp2-&gt;v.y &lt;&lt; temp2-&gt;v.z &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>In der Main wird erstiges (Test temp1 = Test ...) noch ausgefürt doch wenn ich das Testobjekt auf den Heap anlege mit (Test* temp2 = new Test ...) gibt es einen Segfault.</p>
<p>Hat jemand eine Idee woran das liegen kann?</p>
<p>Gruß, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/948694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/948694</guid><dc:creator><![CDATA[timbo]]></dc:creator><pubDate>Fri, 23 Dec 2005 15:17:19 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Fri, 23 Dec 2005 17:09:50 GMT]]></title><description><![CDATA[<p>sse operanden müssen fast immer 16-byte aligned sein, dass garantiert die operator new (oder auch malloc) aber normalerweise nicht. du hast im grunde 3 möglichkeiten:<br />
- du schreibst deinen eigenen globalen operator new (ungünstig)<br />
- du schreibst einen klassenspezifischen operator new<br />
- du schreibst einen allokator dafür (und gegebenfalls einen klassenspezifischen operator new, der den allokator benutzt)</p>
<p>die dritte option hat den vorteil, dass sie wiederverwendbar ist. dann selbst, wenn du operator new per klasse erwsetzt, dafsrt du nicht vergessen, dass dasselbe auch in allen klassen passieren muss, die einen Vektor als member haben.</p>
<p>dazu auch:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-129867.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-129867.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/948767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/948767</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 23 Dec 2005 17:09:50 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Fri, 23 Dec 2005 18:42:54 GMT]]></title><description><![CDATA[<p>Es gibt noch eine vierte Möglichkeit, auch wenn ich sie nicht empfehlen würde. Und zwar bietet SSE auch Instruktionen für nicht ausgerichteten Speicher, dementsprechend muss man aber mit Geschwindigkeitseinbuszen rechnen.</p>
<p>Und dass der Test mit automatischem Speicher funktioniert, ist auch nicht garantiert. Ich würde da mal in die Doku des Compilers gucken. IdR gibt es dafür Erweiterungen. Beim MSC wäre dies zB <em>__declspec(align(16))</em>.</p>
<p>Und schau dir nochmal an, was C++ bei der Konstruktion von Objekten zu bieten hat.</p>
<pre><code class="language-cpp">Test::Test(const float w, const float x, const float y, const float z)
{
    v = Vector(w, x, y, z);
}

    Test temp1 = Test(1.0, 2.0, 3.0, 4.0);
</code></pre>
<p>Das zB ist keine glückliche Implementierung, und zwar in mehrerer Hinsicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/948817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/948817</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 23 Dec 2005 18:42:54 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Fri, 23 Dec 2005 18:58:13 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Und dass der Test mit automatischem Speicher funktioniert, ist auch nicht garantiert. Ich würde da mal in die Doku des Compilers gucken. IdR gibt es dafür Erweiterungen. Beim MSC wäre dies zB <em>__declspec(align(16))</em>.</p>
</blockquote>
<p>das alignment ist bereits teil des __m128 typs, es ist also nicht notwendig, das noch selbst zu ergänzen. das problem mit automatischen speicher ist leider sehr real, insbesondere mit temporaries - meiner erfahrung nach ist g++ 3.x in dieser hinsicht völlig kaputt, mit g++ 4 habe ich keine erfahrung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/948832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/948832</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 23 Dec 2005 18:58:13 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Sat, 24 Dec 2005 13:12:02 GMT]]></title><description><![CDATA[<blockquote>
<p>Das zB ist keine glückliche Implementierung, und zwar in mehrerer Hinsicht.</p>
</blockquote>
<p>Kannst du das Bitte noch etwas spezifizieren? Es ging hier eigentlich auch nur darum, mein Problem darzustellen. In Wirklichkeit initialisiere und berechne ich in der Klasse mehrere Vektoren.</p>
<p>Mus ich dann für die Klasse Vektor nen new Operator überschreiben? Ich lege ja meine Vektoren nur auf dem Stack ab und nur das Objekt der Klasse Test liegt auf dem Heap. Oder wird für das Ablegen von Objekten auf dem Stack auch der new Operator verwendet?</p>
<p>Gruß, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/949185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/949185</guid><dc:creator><![CDATA[timbo]]></dc:creator><pubDate>Sat, 24 Dec 2005 13:12:02 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Sat, 24 Dec 2005 15:54:58 GMT]]></title><description><![CDATA[<p>timbo schrieb:</p>
<blockquote>
<p>Mus ich dann für die Klasse Vektor nen new Operator überschreiben? Ich lege ja meine Vektoren nur auf dem Stack ab und nur das Objekt der Klasse Test liegt auf dem Heap. Oder wird für das Ablegen von Objekten auf dem Stack auch der new Operator verwendet?</p>
</blockquote>
<p>Das ist eine gute frage, theoretisch könnte eine implementation auch für stackbasierte variablen, operator new aufrufen (und ich meine nicht placement new). praktisch passiert das meines wissens aber nicht auf x86 plattformen, und nur dort ist jas SSE relevant.<br />
letzlich musst du einen angepassten (gegenbenfalls vererbten) operator new für alle klassen haben, die ein entsprechendes alignment voraussetzen und direkt auf dem heap angelegt werden sollen, in diesem falle also nur test.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/949292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/949292</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 24 Dec 2005 15:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Sat, 24 Dec 2005 16:33:00 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>das alignment ist bereits teil des __m128 typs, es ist also nicht notwendig, das noch selbst zu ergänzen.</p>
</blockquote>
<p>Hast Recht. Hab mich da zu sehr an meiner Implementierung orientiert, da ich dort nur x,y,z,w als Member habe und nicht m128.</p>
<p>camper schrieb:</p>
<blockquote>
<p>das problem mit automatischen speicher ist leider sehr real, insbesondere mit temporaries</p>
</blockquote>
<p>Yep, solche Probleme gibts trotz explizitem Alignment. IIRC hat zB folgender Operator bei mir nicht funktioniert (MSC):</p>
<pre><code class="language-cpp">template &lt;&gt;
const vector&lt;fp32, 4&gt; operator *(vector&lt;fp32, 4&gt; lhs, const vector&lt;fp32, 4&gt;&amp; rhs)
{
	lhs *= rhs;
	return lhs;
}
</code></pre>
<p>Offenbar scheint der MSC Alignment bei Funktionsparametern nicht zu beachten. Folgendes funktioniert hingegen problemlos:</p>
<pre><code class="language-cpp">template &lt;&gt;
const vector&lt;fp32, 4&gt; operator *(const vector&lt;fp32, 4&gt;&amp; lhs, const vector&lt;fp32, 4&gt;&amp; rhs)
{
	vector&lt;fp32, 4&gt; tmp(lhs);
	tmp *= rhs;
	return tmp;
}
</code></pre>
<p>timbo schrieb:</p>
<blockquote>
<p>Kannst du das Bitte noch etwas spezifizieren?</p>
</blockquote>
<p>Besser wäre zB dies</p>
<pre><code class="language-cpp">Test::Test(float w, float x, float y, float z)
    : v(w, x, y, z)
{
}

    Test temp1(1.0, 2.0, 3.0, 4.0);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/949312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/949312</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 24 Dec 2005 16:33:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Sun, 25 Dec 2005 21:56:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für eure Hinweise. Es funktioniert nun, wenn ich den new Operator der betroffenen Klassen, die Vector verwenden (hier &quot;Test&quot;) überschreibe.</p>
<p>Die Operationen +, -, +=, -= funktionieren soweit. Ich sitze nun gerade am Skalarprodukt. Kann mir vielleicht jemand auf die Sprünge helfen.</p>
<pre><code class="language-cpp">__m128 result = _mm_mul_ps( vector1.m128, vector2.m128 );
return result.m128_f32[0] + result.m128_f32[1] + result.m128_f32[2] + result.m128_f32[3];
</code></pre>
<p>Hier meckert der Compiler rum, dass er m128_f32 nicht kennt.</p>
<p>Gruß, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/949853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/949853</guid><dc:creator><![CDATA[timbo]]></dc:creator><pubDate>Sun, 25 Dec 2005 21:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Mon, 26 Dec 2005 14:02:21 GMT]]></title><description><![CDATA[<p>AFAIK soll __m128 lediglich ein Typ sein, der 128 Bit breit ist. Dass er als eine Struktur daherkommt und über Member wie m128_f32 verfügt, darauf würde ich mich nicht verlassen. Beim GCC gibt es zB mit deinem Code Probleme. Kann dir im Moment auch nicht sagen, was die Intel Spezifikation dazu meint. Ich würde deshalb bei Bedarf einfach casten:</p>
<pre><code class="language-cpp">__m128 result = _mm_mul_ps( vector1.m128, vector2.m128 );
fp32 (&amp;result32x4)[4] = reinterpret_cast&lt;fp32(&amp;)[4]&gt;(result);
return result32x4[0] + result32x4[1] + result32x4[2] + result32x4[3];
</code></pre>
<p>fp32 ist ein 32 Bit Gleitkommatyp, den du selbst bereitstellen musst. Für gängige 32 Bit Rechner reicht dafür ein</p>
<pre><code class="language-cpp">typedef float fp32;
</code></pre>
<p>Natürlich kannst du das auch etwas handlicher verpacken, sofern du sowas öfters brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/950216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/950216</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 26 Dec 2005 14:02:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vektor Klasse mit SSE optimierung on Mon, 26 Dec 2005 16:40:01 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>vielen Dank für deinen Hinweis. So funktioniert es nun.</p>
<p>Das Thema CPU Optimierung ist sicher auch ein großes Kapitel für sich. Mit der SSE Optimierung ist mein Programm jedenfalls genauso schnell bzw. minimal schneller als das ohne SSE Optimierung. Beim Profiling ist mir aufgefallen, dass die Rechenoperationen an sich schon schneller sind (fast doppelt so schnell) aber das laden der Daten in den __m128 Speicher braucht halt auch Zeit und somit gleicht sich das fast wieder aus.</p>
<p>Bei Gelegenheit werde ich mich auch mal intensiver mit dem Kapitel befassen.</p>
<p>Gruß, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/950292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/950292</guid><dc:creator><![CDATA[timbo]]></dc:creator><pubDate>Mon, 26 Dec 2005 16:40:01 GMT</pubDate></item></channel></rss>