Ausgabefehler bei der manuellen Verwendung von libmvec-Intrinsics für Trigo-Funktionen (wie cosf)C++

Programme in C++. Entwicklerforum
Anonymous
 Ausgabefehler bei der manuellen Verwendung von libmvec-Intrinsics für Trigo-Funktionen (wie cosf)

Post by Anonymous »

Unter Bezugnahme auf diesen Link habe ich versucht, die libmvec-Intrinsics in einen vorhandenen C++-Code zu integrieren.
Natürlich musste ich dazu die Forward-Deklaration in
< ändern pre class="lang-cpp Prettyprint-override">

Code: Select all

extern "C" __m128 _ZGVbN4v_cosf(const __m128&);
wobei ich extern „C“ anstelle von nur extern hinzugefügt habe. Allerdings habe ich auch die Eingabesignatur in const __m128& geändert, d. h. eine Referenz, da ich normalerweise so Eingaben in C++-Funktionen schreiben würde.
Dies wird kompiliert, erzeugt aber eine falsche (zufällige/undefinierte) Ausgabe.
Wenn ich stattdessen wieder den Verweis entferne,

Code: Select all

extern "C" __m128 _ZGVbN4v_cosf(const __m128);
Dann wird dies kompiliert und erzeugt auch die beabsichtigte korrekte Ausgabe.
Meine erste Frage ist: Ist das beabsichtigtes Verhalten? Sollte GCC stattdessen einen Kompilierungsfehler auslösen, wenn das Eingabeargument nicht mit dem tatsächlichen Verhalten des Intrinsic übereinstimmt? Liegt das daran, dass der Linker das eigentliche Symbol (ich verlinke über -lm) erst zur Laufzeit sehen kann? Was passiert eigentlich, wenn es kompiliert und dann falsche Werte ausgibt (oder handelt es sich einfach nur um undefiniertes Verhalten)?
Meine zweite Frage lautet: Ist dieser Vorgang kostspielig, da es sich nicht um eine Referenz handelt? Kopiert der Compiler meine __m128 SIMD-Vektoren jedes Mal, wenn er dies aufruft? Mein Godbolt-Test scheint etwas anderes zu suggerieren:

Code: Select all

#include 

extern "C" __m128 _ZGVbN4v_cosf(const __m128);
extern "C" __m128 _ZGVbN4v_sinf(const __m128&);

__m128 simdsinf(const __m128& x){
return _ZGVbN4v_sinf(x);
}
__m128 simdcosf(const __m128 x){
return _ZGVbN4v_cosf(x);
}

Code: Select all

simdsinf(float __vector(4) const&):
jmp     _ZGVbN4v_sinf
simdcosf(float __vector(4)):
jmp     _ZGVbN4v_cosf
Aber ich bin mir nicht sicher, ob das repräsentativ ist?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post