13

Android NDK を使い始めました。私が学んだことの 1 つは、application.mk ファイルを作成して armv7 abi を指定することです。

次のパラメーターを使用して san-angeles の例を作成しています。

APP_MODULES      := sanangeles
APP_PROJECT_PATH := $(call my-dir)/../
APP_OPTIM        := release
APP_ABI          := armeabi-v7a

ただし、これは以前とまったく同じ速度で実行されているようです (つまり、ひどく)。私はGLが制限されているだけで、CPUが制限されていませんか、それとも何か問題がありますか?

コンパイルすると、次のコマンド ライン オプションが出力されることに気付きました。

-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mthumb 

そこで気になるのが「softfp」です。v7 abi、VFP fpu についての言及があり、「親指」は「親指 2」命令を指していると思います (ただし、これらが正確に何であるかはわかりません)。ただし、その「softfp」は私に関係があります。「hardfp」ではないでしょうか?

誰でもこれらの質問について何か考えがありますか? おそらく、HTC Desire に GL ES 2.0 コードを実装する準備ができていると思いますが、可能な限り最高の速度を得られるようにしたいと思います :)

事前に乾杯!

4

1 に答える 1

33

NDK に指定するオプションは、コードのコンパイル方法にのみ影響します。プラットフォームの一部である GL ライブラリやその他のものは変更されません。これらは常に適切な方法で生成されます。GL ハードウェアにジオメトリを投げるだけでは、違いはわかりません。

オプションが効果を発揮しているかどうかを確認したい場合は、単純なベンチマークをダウンロード (または作成) して、倍精度浮動小数点値を使用して一連の操作を実行し、前後の実行にかかる時間を計ります。

-mfloat-abi=softp 引数は、関数間で浮動小数点値を渡す方法を決定します。softfp は、常に整数レジスタまたはスタックで渡されることを意味します。Android で softfp が指定されていない場合、ライブラリの ARMv7-A バージョンは float がハードウェア レジスタに表示されることを期待し、ARMv5TE 用にビルドされたコードは壊れます。

「softfp」は一部の関数に少しオーバーヘッドを追加しますが、ARM では fp レジスタの内外に値を移動するための命令は安価であり、提供される ABI 互換性により価値があります。

「-mthumb」は、Thumb/Thumb2 コードの生成を有効にします。Thumb コードは少し遅くなる傾向がありますが、同等の ARM よりも少し小さくなります。場合によっては、小さいほど CPU i-cache にうまく収まり、実際に高速に実行されることを意味します。これらのデバイスでは常にサイズが問題になるため、デフォルトで Thumb が有効になっています。

疑わしい場合は、「arm-eabi-objdump -dwhatever.o」でコードの逆アセンブリが表示されます。

更新: NDK r9bで -mhard-float のサポートが追加されました。これにより、armeabi-v7a ターゲットの hard-float API 規則を使用して NDK ライブラリを構築できます。

于 2010-06-11T23:09:46.707 に答える