2016-08-03 6 views
2

私はアップルメタルAPIと一緒にsimdライブラリと一緒に遊んでいます。そこヘッダ内のようなコードです:__ext_vector_type__とsimdとは何ですか?

vector_float3 v; 
vector_float3& ref = v; 

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

は、私はそれが実際に何をするか興味と、コンパイラは、関数の引数に、または次のようにvector_float3への参照を許可しない理由

答えて

3

このようなものは、通常のだろうGNU C vector extensionsに打ち鳴らす延長、のように見える:

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

ext_vector_typeのグーグルで、先頭に/末尾にアンダースコアが付きません。the Clang docsなぜ彼らはすでにGNU C __attribute__の中でのみ有効なので、IDKはアンダースコアバージョンを追加したのですか?

私の推測では、は、4要素SIMDレジスタの最初の3要素の値だけを気にしていることをコンパイラに知らせる方法です。それは潜在的に、ソースよりも高い要素に異なるゴミを残す最適化を行うことができます。コンパイラはclang3.8と私のためvector_float3

作品への参照を許可しない理由


。別のコンパイラを試してみてください。あなたの助けのための

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

感謝!私はそれが本当に人気のトピックではないと思うように –

+0

@ AndrewLavq:これはあなたの質問に答えますか?その場合は、上下の矢印の下にあるチェックボックスを使用して承認済みとしてマークしてください。そうでない場合は、質問を編集して、実際に何を求めようとしているかを明確にしてください。 –