2016-08-03 10 views
2

Ich spiele mit Apple Metal API zusammen mit so genannten simd Bibliothek. Es gibt einen solchen Code in einem Header:Was ist __ext_vector_type__ und simd?

typedef __attribute__((__ext_vector_type__(3))) float vector_float3; 

Und ich bin gespannt, was es eigentlich tut und warum der Compiler erlaubt keine Verweise auf vector_float3 in einem Argument der Funktion oder in der nächsten Weise:

vector_float3 v; 
vector_float3& ref = v; 

Antwort

3

Es scheint GNU C vector extensions ein Klirren Erweiterung zu sein, wo so etwas wie das normal wäre:

typedef int v4si __attribute__ ((vector_size (16))); 

Googeln für ext_vector_type ohne die führenden/abschließenden Unterstriche gefunden the Clang docs. IDK, warum sie eine Unterstreichungsversion hinzugefügt haben, da sie bereits nur innerhalb eines GNU C __attribute__ gültig ist.

Meine beste Vermutung ist, dass es eine Möglichkeit ist, den Compiler wissen zu lassen, dass Sie nur über den Wert der ersten 3 Elemente eines 4-Element-SIMD-Registers kümmern. So kann es möglicherweise Optimierungen tun, die andere Abfälle im hohen Element hinterlassen, als die Quelle haben würde.


warum der Compiler erlaubt keine Verweise auf vector_float3

Werke für mich mit clang3.8. Versuchen Sie einen anderen Compiler.

typedef __attribute__((__ext_vector_type__(3))) float vector_float3; 

int foo(vector_float3 &arg) { 
    vector_float3 v; 
    vector_float3& ref = v; // unused, but syntactically valid 
    return arg[0];   // return the low element of the vector, converted to an integer. GNU C vector-extensions syntax. 
} 

compiles to the following asm on the Godbolt compiler explorer

# targeting x86-64 SystemV ABI (so the first integer/pointer arg is in rdi) 
    cvttss2si  eax, dword ptr [rdi] 
    ret 
+0

Dank für Ihre Hilfe! wie ich sehe es ist nicht wirklich beliebt Thema –

+0

@AndrewLavq: Beantwortet das Ihre Frage? Wenn dies der Fall ist, markieren Sie es mit der Checkbox unter den Hoch/Runter-Abstimmpfeilen als akzeptiert. Wenn nicht, bitte bearbeiten Sie die Frage, um klarzustellen, was Sie wirklich fragen möchten. –