8ビット固定小数点演算を行っていますが、配列とB配列の両方がQ7形式であり、それらの和の積を求めます。 デモコード:アームネオン8ビット乗算加算和を32ビットベクトルに使用する方法
int8_t ra1[], ra2[], rb[];
int8x16_t va1, va2, vb;
int16x4_t vsum1, vsum2;
va1 = vld1q_s8(ra1);
va2 = vld1q_s8(ra2);
vb = vld1q_s8(rb);
vsum1 = vdup_n_s16(0);
vsum2 = vdup_n_s16(0);
for (......)
vsum1 = vmlal_s8(vsum1, vget_high_s8(va1), vget_high_s8(vb));
vsum1 = vmlal_s8(vsum1, vget_low_s8(va1), vget_low_s8(vb));
合計+ = a * b;この合計は16ビット、それは簡単にオーバーフローすることができますので、* Q7×Q7 16ビットはQ15を表すことができます。また、私は右にQ7xQ7の結果をシフトすることはできません、私は高精度を維持する必要があります。 どのように私はネオンを使用することができます、私は合計が32ビットa、bはまだ8ビットです。私は転送する必要はありません16ビットとvmlal_s16を使用して、それはゆっくりとなります。 1つの指示時間で。 ネオンの組み込み関数にはこの関数がありません。おそらくネオンのアセンブリコードでこれを行うことができます。誰が助けることができますか?ありがとう。 Hereは、vmlaアセンブリコードの情報です。たぶん私はそれを使用することができます。いくつかのアドバイスを与えてください、私はアセンブリコードに慣れていません。
乗算が遅くなる前に 'a'と' b'を16bitに変換することは確実ですか? AFAIRでは、少なくとも一部のNEON実装では、ハードウェアに16ビットの乗数を持つため、「8ビット×8ビット」のベクトル乗算を「16ビット×16ビット」のベクトル乗算として2倍の時間を要します。この場合は、乗算が有効に追加される前に拡大することを意味します。 – EOF