Wrapper für `__m256` erzeugt Segmentierungsfehler mit Konstruktor - Windows 64 + MinGW + AVX-Probleme
Ich habe eine Gewerkschaft, die so aussieht
union bareVec8f {
__m256 m256; //avx 8x float vector
float floats[8];
int ints[8];
inline bareVec8f(){
}
inline bareVec8f(__m256 vec){
this->m256 = vec;
}
inline bareVec8f &operator=(__m256 m256) {
this->m256 = m256;
return *this;
}
inline operator __m256 &() {
return m256;
}
}
Der __m256 muss an der 32-Byte-Grenze ausgerichtet sein, damit er mit SSE-Funktionen verwendet werden kann, und sollte auch innerhalb der Union automatisch erfolgen.
Und wenn ich das tue
bareVec8f test = _mm256_set1_ps(1.0f);
Ich erhalte einen Segmentierungsfehler. Dieser Code sollte aufgrund des von mir erstellten Konstruktors funktionieren. Wenn ich dies jedoch tue
bareVec8f test;
test.m256 = _mm256_set1_ps(8.f);
Ich erhalte keinen Segmentierungsfehler.
So weil das gut funktioniert, ist die Vereinigung wahrscheinlich richtig ausgerichtet, es gibt nur einen Segmentierungsfehler, der durch den Konstruktor verursacht wird, wie es scheint
Ich benutze GCC 64bit Windows Compiler
--------------------------------- BEARBEITEN Matt hat es geschafft, das einfachste Beispiel für den Fehler zu liefern, der zu passieren scheint Hier
#include <immintrin.h>
void foo(__m256 x) {}
int main()
{
__m256 r = _mm256_set1_ps(0.0f);
foo(r);
}
Ich kompiliere mit-std=c++11 -mavx