Ist es legal zu reinterpret_cast
ein float*
zu einem __m256*
und zugreifen float
Objekte durch einen anderen Zeigertyp?
constexpr size_t _m256_float_step_sz = sizeof(__m256) / sizeof(float);
alignas(__m256) float stack_store[100 * _m256_float_step_sz ]{};
__m256& hwvec1 = *reinterpret_cast<__m256*>(&stack_store[0 * _m256_float_step_sz]);
using arr_t = float[_m256_float_step_sz];
arr_t& arr1 = *reinterpret_cast<float(*)[_m256_float_step_sz]>(&hwvec1);
Machen hwvec1
und arr1
darauf ankommen undefined behavior
S?
Verletzen sie strenge Aliasing-Regeln? [basic.lval]/11
Oder es gibt nur einen definierten Weg von Intrinsic:
__m256 hwvec2 = _mm256_load_ps(&stack_store[0 * _m256_float_step_sz]);
_mm256_store_ps(&stack_store[1 * _m256_float_step_sz], hwvec2);
Warum verstößt es Ihrer Meinung nach nicht gegen die strenge Aliasing-Regel? Meiner Meinung nach verstößt Ihr erster Code dagegen. Ich würde dafür Intrinsics verwenden, genau wie Sie vorschlagen.
– geza
31. August 2018 um 10:14 Uhr
@geza Danke. Ich bin mir nur unsicher, weil auf die unterstrichene Darstellung nie als ein anderer Typ als zugegriffen werden kann
float
– Sanddorn
31. August 2018 um 10:21 Uhr
Willst du es nicht als verwenden
__m256
auch? Wenn nicht, was ist dann der Sinn? 🙂– geza
31. August 2018 um 10:22 Uhr
@geza Also Ihrer Meinung nach, Zugriff auf Floats, die sich darin befinden
__m256
Objekt und innerhalb__m256
Lebenszeit gegen strenge Aliasing-Regeln verstoßen?– Sanddorn
31. August 2018 um 13:12 Uhr
Ja, ich würde es nicht tun. Es gibt eine sicherlich nicht verletzende Lösung, ich würde stattdessen Load/Store Intrinsics verwenden. Der einzige Grund, reinterpret_cast zu wählen, wenn es aus irgendeinem Grund schneller ist. Aber aktuelle Compiler sind ziemlich gut darin, solche Sachen zu optimieren.
– geza
31. August 2018 um 13:41 Uhr