6

組み立てはかなり新しいです。アームインフォメーションセンターは役立つことがよくありますが、手順が初心者にとって少し混乱する場合があります。基本的に私がする必要があるのは、クワッドワードレジスタに4つのfloat値を合計し、その結果を単精度レジスタに格納することです。VPADD命令は私が必要なことを実行できると思いますが、よくわかりません。

4

3 に答える 3

4

You might try this (it's not in ASM, but you should be able to convert it easily):

float32x2_t r = vadd_f32(vget_high_f32(m_type), vget_low_f32(m_type));
return vget_lane_f32(vpadd_f32(r, r), 0);

In ASM it would be probably only VADD and VPADD.

I'm not sure if this is only one method to do this (and most optimal), but I haven't figured/found better one...

PS. I'm new to NEON too

于 2011-08-03T20:13:38.900 に答える
2

4 つの float 値だけでなく、特定の長さの配列の合計を取得したいようです。

その場合、コードは機能しますが、最適化には程遠いです:

  1. 多くの多くのパイプライン インターロック

  2. 反復ごとの不要な 32 ビット加算

配列の長さが 8 の倍数で、少なくとも 16 であると仮定します。

  vldmia {q0-q1}, [pSrc]!
  sub count, count, #8
loop:
  pld [pSrc, #32]
  vldmia {q3-q4}, [pSrc]!
  subs count, count, #8
  vadd.f32 q0, q0, q3
  vadd.f32 q1, q1, q4
  bgt loop

  vadd.f32 q0, q0, q1
  vpadd.f32 d0, d0, d1
  vadd.f32 s0, s0, s1
  • pld - NEON ではなく ARM 命令ですが、パフォーマンスにとって重要です。キャッシュのヒット率が大幅に向上します。

上記のコードの残りの部分が自明であることを願っています。

このバージョンは、最初のバージョンより何倍も高速であることに気付くでしょう。

于 2011-11-01T06:21:12.783 に答える
2

ASM のコードは次のとおりです。

    vpadd.f32 d1,d6,d7    @ q3 is register that needs all of its contents summed          
    vadd.f32 s1,s2,s3     @ now we add the contents of d1 together (the sum)                
    vadd.f32 s0,s0,s1     @ sum += s1;

C のコードは次のようになることを忘れていたかもしれません。

float sum = 1.0f;
sum += number1 * number2;

この小さな asm コードから乗算を省略しました。

于 2011-08-05T18:33:14.940 に答える