Ich würde gerne wissen, ob ich strenge Aliasing-Regeln mit diesem Snippet zu brechen. (Ich glaube, so da es dereferencing einen punned-Zeiger, aber es ist in einem einzigen Ausdruck gemacht wird und/Wand weint nicht.)Bricht ich strenge Aliasing-Regeln?
inline double plop() const // member function
{
__m128d x = _mm_load_pd(v);
... // some stuff
return *(reinterpret_cast<double*>(&x)); // return the lower double in xmm reg referred to by x.
}
Wenn ja, was ist die Abhilfe? Die gleichzeitige Verwendung verschiedener Repräsentationen wird immer schwieriger, wenn Sie die Spezifikation respektieren wollen.
Danke für deine Antworten, ich verliere meine gute Laune und versuche eine Lösung zu finden.
Antworten, die nicht akzeptiert und warum werden:
„Verwendung mm_store“ -> Der Optimierer schlägt fehl, es zu entfernen, wenn die folgenden Anweisungen ein XMM-Register erfordern, so dass es eine Last nur, nachdem sie erzeugt. Speichern + Laden für nichts.
"Verwenden Sie eine Union" -> Aliasing Regelverletzung, wenn Sie die beiden Arten für das gleiche Objekt verwenden. Wenn ich den Artikel von Thiago Macieira gut verstanden habe.
Was ist mit einem einfachen alten 'memcpy' zu einem' double'? – Praetorian
Es ist fast unmöglich, Aliasing im Umgang mit SIMD zu vermeiden. Im Idealfall vermeiden Sie den Zugriff auf einzelne Elemente, wie Sie es gerade sind, aber wenn Sie unbedingt benötigen, empfehle ich eine Vereinigung für Dinge auf dem Stapel und einen Zeiger für Zeiger aus Parametern. Unionstyp-Punning ist in C99 explizit erlaubt, und alle Mainstream-Compiler werden es auch nach C++ übertragen. Der Versuch, im Umgang mit einer nicht standardmäßigen Erweiterung vollständig normkonform zu sein, ist in gewisser Weise in sich widersprüchlich. – Mysticial
@Praetorian: verwendet nicht simd intrinsics und memcpy ein bisschen paradoxal nennen? ^^ – ThiSpawn