5

( http://www.stereopsis.com/FPU.html ) ( x86 で float を int に変換する最速の方法は何ですか) で言及されているものを読みました。遅い単純なキャスト (以下のスニペットを参照) が ARM アーキテクチャにも適用されるかどうかを知っている人はいますか?

inline int Convert(float x)
{
  int i = (int) x;
  return i;
}

FPU の記事に記載されているいくつかのトリックを適用するには、浮動小数点演算の精度を設定する必要があります。ARMでそれを行うにはどうすればよいですか?

ARM アーキテクチャで最も高速な float から int への変換は何ですか?

ありがとう!

4

1 に答える 1

11

短いバージョン、「いいえ」。

その記事は古いものであり、ARM はおろか、最新の x86 システムにも当てはまりません。単純な整数へのキャストは、ARMv7 (iPhone 3GS/4) ではかなり高速ですが、VFP/NEON レジスタから汎用レジスタにデータを移動する際に多少のストールがあります。ただし、floatデータが VFP/NEON レジスタで行われた計算から得られる可能性が高いことを考えると、変換方法に関係なく、その移動に対して料金を支払う必要があります。

これがプログラムの主要なボトルネックであることを示す痕跡がない限り、これが最適化の有益な道だとは思いません。それでも、最速の変換は、実行しない変換です。ほとんどの場合、プログラムから変換を排除するアルゴリズム的な方法を見つけたほうがよいでしょう。

本当に変換を最適化する必要がある場合はvcvt.i32.f32、2 つまたは 4 つの浮動小数点数のベクトルを 2 つまたは 4 つの整数のベクトルに変換する命令を調べてください。NEON レジスタからデータ移動することはありません (したがって、ストールを発生させることはありません)。私が言及したこと)。もちろん、これが有益な最適化であるためには、NEON ユニットで後続の整数計算を行う必要があります。

質問:あなたは本当に何をしようとしていますか?より高速な float->int 変換が必要なのはなぜだと思いますか?

于 2010-08-15T05:50:26.077 に答える