ザイリンクスSpartan 3やVirtex 5などの通常のFPGAを使用している場合、倍精度浮動小数点64ビット乗算または除算を実行するには何サイクルかかりますか。
答えは:はい!
しかし真剣に、それは数を考え出すことは非常に困難です。複雑なロジックを設計する場合、さまざまなものの間で常にトレードオフがあり、すべての設計に1つのアプローチが適しているわけではありません。大きなものをカバーしようと思います。
ロジック設計では、サイズと速度のトレードオフが1つあります。この簡単な例は、単一の浮動小数点乗算器が遅すぎるとしましょう。それをスピードアップするには、2番目の乗数を追加するだけです。ロジックサイズは2倍になりますが、1秒あたりの乗算数は2倍になります。しかし、単一の乗数だけを見ても、数値を乗算する方法はいくつかあります。速くて大きいものもあれば、小さくて遅いものもあります。
別のトレードオフは、クロック速度と乗算あたりのクロック数です。1つのクロックで単一の浮動小数点乗算を行うロジックを設計できます。ただし、その場合はクロックを遅くする必要があります-おそらく10 MHzほど遅くなります。または、100 MHzクロックで動作するように設計することもできますが、乗算ごとに10クロックが必要です。全体の速度は同じ(1つは100 nsで乗算)ですが、1つはより速いクロックを持っています。
前の段落に関連するのは、クロック速度と乗算遅延のトレードオフです。ロジックデザインにはパイプラインと呼ばれる手法があります。基本的に、ロジックのチャンクを取り、それを小さなステージに分割します。各ステージは、完了するまでに1クロックサイクルかかります。ここでの利点は、他のステージが他の乗算を処理している間に、各ステージが乗算を処理できることです。たとえば、10ステージのパイプラインを使用して100 MHzで実行しているとします。これは、乗算ごとに10クロックかかることを意味しますが、ロジックは同時に10の異なる乗算に対しても機能します。クールなことは、すべてのクロックサイクルで乗算を完了することです。したがって、乗算ごとの有効なクロックは1で、これらの乗算が完了するまでに10クロックかかります。
したがって、FPGAがどれだけ速く乗算を実行できるかという質問への答えは、実際にはあなた次第です。FPGAにはさまざまなサイズと速度があり、必要に応じてそのロジックを手元のタスクに割り当てることができます。しかし、特定のシナリオを見てみましょう...
最大のSpartan-3Aを使用したいとし、32ビットの浮動小数点乗算のみを対象とするとします。32ビット浮動小数点乗算には、24x24整数乗算器と8ビット加算器が必要です。これには、4つの専用の乗算器ブロックといくつかの一般的なスライスが必要です(少なすぎると問題になります)。XC3S1400Aには32の専用乗算器があるため、8つの浮動小数点乗算器を並列に実行できます。クロック速度の大まかな推測は約100 MHzになります。このデザインを完全にパイプライン化して、クロックサイクルごとに4つの32ビット浮動小数点乗算を完了することができ、1秒間に8億の浮動小数点乗算の実効速度を実現できます。
倍精度乗算では、浮動小数点乗算ごとに9つの専用乗算器ブロックが必要なので、並列処理は3つしか実行できません。その結果、毎秒約3億の64ビット浮動小数点乗算の速度が得られます。
比較のために、新しいザイリンクスVirtex-7シリーズを検討してみましょう。その中の専用乗算器は大きいので、64ビット浮動小数点乗算には6つの専用乗算器ブロックしか必要ありません。最大の部分には1,920の専用乗算器もあります。したがって、320倍の倍精度浮動小数点乗算を並列に実行できます。これらのパーツもはるかに高速です。これらの部品を200 MHzで実行できると私は見積もっており、合計速度は毎秒64億の倍精度浮動小数点乗算です。もちろん、これらのチップの価格はそれぞれ約10,000米ドルです。
浮動小数点除算は、すばやく行うのがはるかに困難です。ロジックは特にFPGAではるかに大きく、実行速度は非常に遅くなります。同じことがほとんどのCPUにも当てはまり、除算命令(浮動小数点と固定小数点)の実行速度が大幅に低下します。速度が重要な場合は、できるだけ多くの分割を排除する必要があります。たとえば、5で割るのではなく、0.2を掛ける必要があります。実際、多くのシステムでは、単に除算を行うよりも、逆数を計算して乗算を行う方が高速です。
除算にも乗算と同じトレードオフが適用されます。除算は乗算よりもずっと遅く、はるかに大きくなるだけです。