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