iPhone 4とiPadにはVFPと呼ばれるfpuがあり、浮動小数点演算を何らかの方法で最適化し、SIMDを許可していると聞きました(GCCがそれを利用するかどうかは疑わしいですが)。ただし、一部のAndroidデバイスでは、浮動小数点よりも固定小数点を使用する速度を上げると、パフォーマンスが20倍向上する可能性があることを読みました。
これらのデバイスで浮動小数点よりも固定小数点演算を使用して、コードの浮動小数点を多用する部分を実装することの利点は何でしょうか。
iPhone 4とiPadにはVFPと呼ばれるfpuがあり、浮動小数点演算を何らかの方法で最適化し、SIMDを許可していると聞きました(GCCがそれを利用するかどうかは疑わしいですが)。ただし、一部のAndroidデバイスでは、浮動小数点よりも固定小数点を使用する速度を上げると、パフォーマンスが20倍向上する可能性があることを読みました。
これらのデバイスで浮動小数点よりも固定小数点演算を使用して、コードの浮動小数点を多用する部分を実装することの利点は何でしょうか。
iPhone 3G armv6 CPU には、同じ計算を整数で行うよりもスループットが高い VFP パイプライン浮動小数点ユニットがありました。GCC は、パイプライン用にスケジュールされた VFP 命令の生成をサポートしています。iPhone 3GS および iPhone 4 の armv7 CPU にはパイプライン化された VFP ユニットがないため、一部の浮動小数点シーケンスで iPhone 3G よりも若干遅くなります。ただし、armv7 プロセッサは、代わりに NEON 並列ベクトル ユニットを備えているため、ベクトル化可能な短い浮動小数点で高速です。一部の Android デバイス CPU にはハードウェア浮動小数点ユニットがまったくないため、OS は FP にソフトウェア エミュレーションを使用しますが、これは整数または固定小数点よりも 1 桁以上遅くなる可能性があります。
一般的な経験則として、アルゴリズムが 24 ビットの仮数部の精度しか処理できず、浮動小数点数と整数の間で多くの変換を行わない場合は、iOS で短い浮動小数点数を使用します。ほとんど常に高速です。
ただし、C コード (NDK を使用) で古い Android デバイスをサポートする場合は、スケーリングされた整数を使用します。
0.1% 未満の典型的なアプリでは、アプリが多くの数値処理を行わない場合、上記のどれも実際には顕著な違いはありません。
hotpaw2が言ったように、iPhone4とiPad2の両方にハードウェア浮動小数点があるので、そのようなハードウェアがないプラットフォームで得られる桁違いのスピードアップは見られません。
とは言うものの、NEONベクトルユニットは浮動小数点だけでなく整数演算もサポートしており、代わりに固定小数点問題としてキャストすることで特定の演算を高速化することができます。 ただし、自分が何をしているのかを本当に理解していて、重要なルーチンのアセンブリ実装を作成する準備ができていない限り、何のメリットもありません。
問題に適している場合は、浮動小数点に固執します。パフォーマンスを向上させる必要がある場合は、アプリの実行をトレースすることで、チューニングの機会が大幅に増えることを保証します。