EABIとOABIのページでは、EABIでは浮動小数点演算がとても速くなると紹介しました。本ページでは、EABIにおける浮動小数点演算の取扱いを詳しくみていきます。 なお、ツールチェインやライブラリは、emdebianのものを使用します。emdebianツールチェインのインストール方法は、ARMクロス開発環境構築を参照してください。 1. デフォルトの浮動小数点演算の取扱い 〜 soft-float 〜まずは、デフォルトで浮動小数点演算がどのように処理されるのか、見ていきます。サンプルプログラムとして、以下のコードを使用します。 これを、デフォルトの設定でコンパイルしてみます。emdebianのEABI用ツールチェインでは、デフォルトで"-mfloat-abi=soft"がついたものと同じ、すなわち、ソフトフロートのコードを生成します。 浮動小数点演算は、__aeabi_dmul()という関数に置き換えられました。__aeabi_dmul()は、実行ファイルにスタティックリンクされており、FPAやVFPなどの浮動小数点演算命令を含まない関数です。 浮動小数点演算が浮動小数点演算命令を含まない関数に置き換えられたことで、(浮動小数点演算ユニットを持たないハードで)浮動小数点演算をおこなったときにFPEによるコンテキストスイッチが発生せず、浮動小数点演算が速くなります。 OABIでは、浮動小数点演算はFPA用の浮動小数点演算命令で処理していました。しかし、現在のARMプロセッサでFPAを搭載しているものは(おそらく)存在しません。そのため、ほぼ全てのハードで、OABIからEABIへユーザランドを変更することで浮動小数点演算高速化の恩恵を受けることができます。("ほぼ全て"としたのは、OABIでもアプリとライブラリすべてがhard-floatでビルドされている場合、EABIのsoft-floatよりも、浮動小数点演算は高速に処理できるからです。) 2. 浮動小数点演算ユニットを使う 〜 softfp 〜EABIのsoft-floatにした場合、VFPなどの浮動小数点演算ユニットを持っているハードでもそれらを使用しないことになります。せっかくVFPがついているのであれば、できればその能力を活かしたいところです。EABIで浮動小数点演算命令を含むバイナリを生成するためのコンパイルオプションとして、"softfp"というものがあります。("hard-float"は、EABIでは使用することはできません。) softfpは、gcc-4.3のmanページによると以下のような意味を持つオプションです。 "softfp"でコンパイルするとどうなるか、実際に見てみましょう。 浮動小数点演算は、"fmuld"という命令に置き換えられました。"fmuld"は、VFP用の浮動小数点演算命令です。 "softfp"でコンパイルされたバイナリは、浮動小数点演算命令を含みます。一方で、コーリングコンベンションは"soft-float"(デフォルト)と同じです。このため、"softfp"でコンパイルされたバイナリと"soft-float"でコンパイルされたバイナリは混ぜることができます。 このため、浮動小数点演算がボトルネックになっていて、それを改善したい場合、もしアプリ側にボトルネックがあるのならばアプリだけを"softfp"でビルドしなおしたり、ライブラリの一つが問題であればそのライブラリだけを"softfp"でビルドしなおして使用するといったことが可能です。 Debianのarmelパッケージで提供されるライブラリは"soft-float"なので、速度が問題となっているところだけ"softfp"に置き換えることができるというのは、とても便利だったりします。 |