4

以前は FPU との統合タスクを行っていましたが、現在は SSE に苦労しています。

私の主な問題は、FPUスタックを使用していたときfsinに、スタックの一番上(st0)にある番号で使用できる関数があったことです。

ここで、 で 4 つの数値すべてのサインをXMM0計算するか、別の場所で計算してから に移動したいと考えていますXMM0。AT&T 構文を使用しています。

2番目のアイデアは実際に可能だと思いますが、方法がわかりません:)

誰もそれを行う方法を知っていますか?

4

1 に答える 1

4

3 つのオプション:

  1. sinSSE ベクトルを計算する既存のライブラリを使用します。
  2. sinSSE を使用して独自のベクトル関数を記述します。
  3. ベクトルをメモリにfsin保存し、各要素のサインを計算するために使用し、結果を読み込みます。スタックが 16 バイトにアラインされており、16 バイトのスペースがあると仮定すると、次のようになります。

       movaps  %xmm0, (%rsp)
       mov     $3,     %rcx
    0: flds   (%rsp,%rcx,4)
       fsin
       fstps  (%rsp,%rcx,4)
       sub     $1,     %rcx
       jns     0b
    

(1) は、ほぼ確実にパフォーマンス面で最善の策であり、最も簡単でもあります。ベクトル コードを記述した豊富な経験があり、引数が特定の範囲に収まることをアプリオリに知っている場合は、(2) を使用してパフォーマンスを向上させることができる場合があります。を使用してfsinも機能しますが、問題がある場合は、醜くて遅く、特に正確ではありません。

于 2012-05-13T12:46:45.173 に答える