7

浮動小数点ハードウェアを備えていないが、16ビットのALUと40ビットのMACのみを備えたアーキテクチャに取り組んでいます。

私はすでに32ビット単精度浮動小数点の加算/減算、乗算、コサイン、サイン、除算、平方根、および範囲縮小をすべてこのアーキテクチャのソフトウェアに実装しています。

余弦と正弦を実装するために、最初にKCNGの論文「巨大な引数の引数削減」で説明されている方法を使用して範囲縮小を使用しました。 次に範囲-piの余弦関数と正弦関数の多項式近似である余弦関数と正弦関数を実装しました。 /4から+pi/4。私は「コンピュータ近似」という本、ハートらを参照しました。多項式の場合。

また、CORDICアルゴリズムを検討する必要があると聞いています。しかし、私がすでに使用した方法よりも効率が高いか低いか(スループット、メモリオーバーヘッド、および必要な命令数の点で)誰かが知っているかどうか疑問に思っていましたか?私は、各コアが128ワードの命令メモリと128ワードの16ビットデータメモリのみを備えているマルチコアアーキテクチャにソフトウェア機能を実装しました。また、コサインとサインのCORDICアルゴリズムを実装する方法を検索しようとしましたが、32ビット浮動小数点の実装に適したリソースが見つかりませんでした。誰か提案がありますか?

ありがとうございました!

4

2 に答える 2

6

CORDICは、ループの反復ごとに1ビットを提供するため、ソフトウェアでの実装は、多項式バージョンよりも遅くなる可能性があります。それはまた、CORDICのソフトウェア実装に関する記事を見つけるのが難しい理由かもしれません:そのパフォーマンスは劣っているので、誰も気にしません。

コメントを再確認してください。 ホーナー法は、係数を繰り返し加算してから変数を乗算することにより、多項式を最高次の係数から最低次の係数まで評価する方法ですx。対照的に、ナイーブな方法(つまり、x最初にの累乗を評価し、次にそれらに係数を掛けてそれらを足し合わせる)は、ホーナー法よりも多くの作業を必要とし、数値的に安定しません。

多項式をどのように評価しようとしているのか正確には言及していないので、次の式を提案します。

x2 = x * x
cos = ((COS_D * x2 + COS_C) * x2 + COS_B) * x2 + COS_A
sin = (((SIN_D * x2 + SIN_C) * x2 + SIN_B) * x2 + SIN_A) * x

テイラー係数を使用するのではなく、関数を評価する範囲に定数を適合させると、精度が向上することに注意してください。(繰り返しますが、これらのことの一部またはすべてを実行した場合はお詫びしますが、すでに試したことについては言及していません...)


これはおそらくあなたのケース(おそらく16x16ビットのMACしかない)にはあまり関係がありませんが、プロセッサが一度に複数の算術評価を起動できる場合は、ツリーのようなもので評価を書くとパフォーマンスが向上する可能性がありますフォーム、操作の順次依存関係の一部を回避します。

x2 = x * x
x4 = x2 * x2
cos = (COS_D * x2 + COS_C) * x4 + (COS_B * x2 + COS_A)
sin = ((SIN_D * x2 + SIN_C) * x4 + (SIN_B * x2 + SIN_A)) * x

プロセッサにベクトルALUがある場合、この式はそれの生産的な使用も示唆しています...

于 2013-03-14T19:31:13.280 に答える
3

MACが、同等のシフトとandsおよびaddのシーケンスよりも大幅に高速である場合は、多項式を使用します。CORDICも考慮しないでください(範囲縮小の1つまたは2つのステップを除いて)。FP CORDICアルゴリズムを正確に見つけることは困難です。これは、FPが使用されるすべてのシステム(過去35年間)にその基準が常に当てはまるため、CORDICは考慮されないためです。

于 2013-03-14T23:30:14.357 に答える