<?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[Problem mit Alignment?]]></title><description><![CDATA[<p>Ich dachte, dass ich mal zum Testen der SSE-Intrinsics eine kleine Vectorklasse schreibe.<br />
Nun kriege ich beim Testen urplötzlich Segfaults. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Dürfte also wohl am Alignment liegen...</p>
<p>Momentan siehts also wie folgt aus. :</p>
<pre><code class="language-cpp">#include &lt;xmmintrin.h&gt;

struct Vec3f {
    union {
        __m128 vectorSSE;
        struct {
            float x;
            float y;
            float z;
            float fill;
        };
    }; 

    Vec3f();
    Vec3f(float value);
    Vec3f(float value1, float value2, float value3);
    Vec3f(__m128 vec);

    ~Vec3f() {};

    Vec3f operator+(const Vec3f&amp; vec);
    Vec3f operator-(const Vec3f&amp; vec);
    Vec3f operator*(float scalar);
    float operator*(const Vec3f&amp; vec);
    Vec3f operator|(const Vec3f&amp; vec);

    float sqLength();    
    float length();

};
</code></pre>
<p>Eigentlich müssten die Daten in der Union ja richtig aligned sein, der Inteldoku mal zu urteilen.<br />
Nun kann ich dies auch munter lustig benutzen bis auf die sqLength-Funktion, die eigentlich fast identsich mit der operator* ist.</p>
<pre><code class="language-cpp">float Vec3f::operator*(const Vec3f&amp; vec) {
    float res[4];
    __m128 temp = _mm_mul_ps(vectorSSE, vec.vectorSSE);
    __m128 temp2 = _mm_shuffle_ps(temp, temp, 0x0000004E);
    temp = _mm_add_ps(temp, temp2);
    _mm_storeu_ps(res, temp);
    return res[0]+res[1];
}

float Vec3f::sqLength() {
    float res[4];
    __m128 temp = _mm_mul_ps(vectorSSE, vectorSSE);
    __m128 temp2 = _mm_shuffle_ps(temp, temp, 0x0000004E);
    temp = _mm_add_ps(temp, temp2);
    _mm_storeu_ps(res, temp);
    return res[0]+res[1];
}
</code></pre>
<p>Des erste geht, das zweite nicht. Der Segfault tritt dabei immer im store auf, das eigentlich mit unaligned Daten ja keine Probleme haben sollte. (der gcc ignoriert mein _declspec(align(16)). Deswegen storeu.)</p>
<p>Wo liegt also jetzt hier das Problem?</p>
<p>Compiler ist der gcc 3.4.2 (MinGW) wenns hilft...</p>
<p>Thanks schonmal<br />
Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/117542/problem-mit-alignment</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 00:51:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/117542.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Aug 2005 17:00:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Alignment? on Mon, 08 Aug 2005 17:00:58 GMT]]></title><description><![CDATA[<p>Ich dachte, dass ich mal zum Testen der SSE-Intrinsics eine kleine Vectorklasse schreibe.<br />
Nun kriege ich beim Testen urplötzlich Segfaults. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Dürfte also wohl am Alignment liegen...</p>
<p>Momentan siehts also wie folgt aus. :</p>
<pre><code class="language-cpp">#include &lt;xmmintrin.h&gt;

struct Vec3f {
    union {
        __m128 vectorSSE;
        struct {
            float x;
            float y;
            float z;
            float fill;
        };
    }; 

    Vec3f();
    Vec3f(float value);
    Vec3f(float value1, float value2, float value3);
    Vec3f(__m128 vec);

    ~Vec3f() {};

    Vec3f operator+(const Vec3f&amp; vec);
    Vec3f operator-(const Vec3f&amp; vec);
    Vec3f operator*(float scalar);
    float operator*(const Vec3f&amp; vec);
    Vec3f operator|(const Vec3f&amp; vec);

    float sqLength();    
    float length();

};
</code></pre>
<p>Eigentlich müssten die Daten in der Union ja richtig aligned sein, der Inteldoku mal zu urteilen.<br />
Nun kann ich dies auch munter lustig benutzen bis auf die sqLength-Funktion, die eigentlich fast identsich mit der operator* ist.</p>
<pre><code class="language-cpp">float Vec3f::operator*(const Vec3f&amp; vec) {
    float res[4];
    __m128 temp = _mm_mul_ps(vectorSSE, vec.vectorSSE);
    __m128 temp2 = _mm_shuffle_ps(temp, temp, 0x0000004E);
    temp = _mm_add_ps(temp, temp2);
    _mm_storeu_ps(res, temp);
    return res[0]+res[1];
}

float Vec3f::sqLength() {
    float res[4];
    __m128 temp = _mm_mul_ps(vectorSSE, vectorSSE);
    __m128 temp2 = _mm_shuffle_ps(temp, temp, 0x0000004E);
    temp = _mm_add_ps(temp, temp2);
    _mm_storeu_ps(res, temp);
    return res[0]+res[1];
}
</code></pre>
<p>Des erste geht, das zweite nicht. Der Segfault tritt dabei immer im store auf, das eigentlich mit unaligned Daten ja keine Probleme haben sollte. (der gcc ignoriert mein _declspec(align(16)). Deswegen storeu.)</p>
<p>Wo liegt also jetzt hier das Problem?</p>
<p>Compiler ist der gcc 3.4.2 (MinGW) wenns hilft...</p>
<p>Thanks schonmal<br />
Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848193</guid><dc:creator><![CDATA[Thorn]]></dc:creator><pubDate>Mon, 08 Aug 2005 17:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Alignment? on Mon, 08 Aug 2005 22:54:08 GMT]]></title><description><![CDATA[<p>Prüfe mal, ob vectorSSE an einer durch 16 teilbaren Adresse liegt.<br />
An welcher Stelle bekommst du eigentlich Segfaults?</p>
<p>Thorn schrieb:</p>
<blockquote>
<p>der gcc ignoriert mein _declspec(align(16))</p>
</blockquote>
<p>Das liegt daran, dass dies beim GCCanders heisst, __attribute__((aligned(16))), IIRC.</p>
<p>noch 2 Tipps:<br />
1. Dein Code ist nicht standardkonform, da es keine unnamed structs gibt.<br />
2. Definiere die binären Non-Assignment Operatoren ausserhalb der Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848373</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 08 Aug 2005 22:54:08 GMT</pubDate></item></channel></rss>