2016-08-16 8 views
1
私はテーブルからいくつかの値をロードし、ベクターにそれらを設定したい

最初のケース内へのベクターの四つの値を設定します。は、ARM NEON組み込み関数と4 floatx32のベクトルを設定することはできません

float32x4_t dest = vdupq_n_f32(a); 

これは、組み込み関数のマニュアルを読んだときにはっきりと分かりました。

2番目のケースでは、ベクトルの4つの値をテーブルから異なる値に設定します。そのための指示がないので、これは少しトリッキーだったので、私は次のようでした:それは本質的ではありません

float32x4_t dest = {a3,a2,a1,a0}; 

しかし、ネット上の他の出版物やフォーラムに基づかそれは私のための唯一のソリューションでした。残念ながら、私はこのエラーが発生しています:

error: expected expression before ‘{’ token 

誰もがこれを助けることができますか?

+1

どのコンパイラを使用していますか?これはgcc、clang、et alと動作するはずです。 –

+0

ARM-gnueabi-gcc with eclipse Mars –

答えて

4

コンパイラがgccやclang以外のものを使用しているなど、直接的な初期化をサポートしていない場合は、明示的に値をロードする必要があります。

const float init[4] = {a3,a2,a1,a0}; 
float32x4_t dest = vld1q_f32(init); 

あなたの最初の例は、間違っているように見える注 - (SSEの_mm_set1_psなど)と同じ値にすべての4ベクトル要素を設定しようとしているならば、あなたはvdupq_n_f32のようなものを使用したいと思います。

+0

ああ私はパフォーマンスを求めています....このように、initの配列がいっぱいになってからdestにロードされるまで待つことになります –

+0

通常、この種のベクトルの初期化は一度だけ実行されます。機能の開始時に、パフォーマンスクリティカルなループよりも前に実行されるため、ここではパフォーマンスに何ら影響を与えません。例えばあなたのために生成されたコードを見ると、 '_mm_set_ps'を実行すると、多くの命令が実行されることもあります(すべてのイントリンシックスが単一の命令にマップされていると誤解されることはありません)。 –

+0

あなたは100%正しいですが、設定のことがループで何回も呼び出されるという問題... X86バージョンではタイミングは素晴らしいですが、ARMバージョンでは期待通りではありません... ARMではシリアルバージョンがはるかに速くSIMD版とこれは私を混乱させた。 –

関連する問題