2016-07-30 7 views
2

ARMイントリンジンには、さまざまなサイズのスカラーを抽出する関数が含まれています。機能はARM® C Language Extensionsに最も完全に文書化されている:vgetq_lane_u64(x、0)vget_low_u64(x)

ET vgetQ_lane_ST(T vec, const int lane); 

は、入力ベクトルの指定されたレーンから値を取得します。組み込み関数は です。

そして:

T vget_high_ST(T2 a); 
T vget_low_ST(T2 a); 

は、128ビットのベクトルの高い、または低い、半分を取得します。 24 の組み込み関数があります。

状況によっては同じことが分かります。例えば、リトルエンディアンのマシン上で、以下は64ビット値にも当てはまる:

uint64x2_t x = ...; 
vgetq_lane_u64(x, 0) == vget_low_u64(x); 

同様の等価性が高い車線のために存在する:

uint64x2_t x = ...; 
vgetq_lane_u64(x, 1) == vget_high_u64(x); 

私の質問はどのようなものであり、両方の関数がスカラーを返すので実際的な違いはありますか?一方は他方より優先されるべきですか?

+0

「リトルエンディアンマシンで」はおそらく関連性がありません。なぜなら、あなたは配列のインデックスを作成していないからです。ベクトルレジスタのインデックス要素は、スカラーレジスタの整数の左/右シフトによく似ています。私は見ていませんが、いずれのエンディアンでも実行できるアーキテクチャは、ベクトルをシャッフルする命令の動作を変更したり、ベクトルの中にスカラを挿入/抜き出したりしないものとします。 (もちろん、スカラーがメモリから来る場合、エンディアンはスカラー内のバイト順ではなく、ベクトル内の要素位置では関係ありません。) –

答えて

4

オーバーラップは実装の詳細と考えています。 "...両方の関数がスカラーを返すので"最初は、vgetq_lane_u64()はスカラーであるuint64_tを返します。 vget_low_u64()は、単位長ベクトルであるuint64x1_tを返します。意味的に

uint64_t vget_lane_u64(uint64x1_t v, const int lane) 

を、あなたはベクトル演算からQレジスタの出力を持ち、Dレジスタにさらにベクトル演算にデータを渡すためにそれを分割する必要がどこにvget_{high,low}を使用:この男も存在することを考えてみましょう。スカラーコードに渡すために単一の値を実際に抽出するときは、vget{,q}_laneを使用してください。私は単位長のベクトル型とスカラー型の間の暗黙の変換は実際にどこでも保証されていないと確信しているので、確かにそれに依存しません。

+0

* "" ...両方の関数がスカラーを返すので "偶数ではありません本当... "* - ああ、あなたは正しい。私はその詳細を逃した。 'uint64_t'と' uint64x1_t'の間で警告なしで変換するので、GCCとClangは主に対応しているようです。 – jww

+0

元々は、ビッグエンディアンとリトルエンディアンの間の動きやすさに違いがあると思っていました。つまり、車線番号を#defineし、big-endianとlittle-endianに応じて定義を変更することができます。 – jww

+2

@jww [GCCベクトル拡張](https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html#Vector-Extensions)([Clangと同様](http://clang.llvm。 org/docs/LanguageExtensions.html#vectors-and-extended-vectors)) - NEON型で大変なことが起こります。 – Notlikethat

関連する問題