2014年1月30日木曜日

hardfpビルド

nbenchがらみでいろいろ見ていますと、
raspberrypiのフォーラムでも結構その手の投稿があります。
そこらへんを見ていると、Debianなどはhardfpのライブラリに変えているようですね。
ひるがえって、yoctoのmeta-raspberrypiの方を見てみますと、softfpでビルドされているようです。
ここらへんに、その設定があります。
meta-raspberrypi/conf/machine/
├── include
│   ├── rpi-default-providers.inc
│   ├── rpi-default-settings.inc
│   ├── rpi-default-versions.inc
│   └── tune-arm1176jzf-s.inc
└── raspberrypi.conf
この中で、tune-arm1176jzf-s.incを見てみますと、
DEFAULTTUNE ?= "armv6"
ここで、デフォルトではarmv6の設定でビルドされることが決まっています。
この値は、local.confなどでオーバーライドするとよさそうです。
require conf/machine/include/arm/arch-armv6.inc
arch-armv6.incでarmv6のビルドオプションが決められていますが、
このファイル自体は、poky/meta/とpoky/openembedded-core/meta/の2箇所で見つかります。
diffで見たところ、(今のところ)違いはないようです。
私のbblayers.confではopenembedded-coreの方にはパス(レイヤ?)を通していないので
おそらくpoky/meta/conf/machine/include/arm/arch-armv6.incの方が
使われていると思われます。
そのarch-armv6.incを見てみますと、ごちゃごちゃしているので関係するところで、
AVAILTUNES += "armv6-novfp armv6t-novfp armv6 armv6t armv6hf armv6thf"
どうやら使えるのは、こんなかんじのようです。
hfはhardfp, tはthumb, novfpはvfpなしということのようです。
なので、armv6hfあたりにすると、よさそうですね。

tune-arm1176jzf-s.incの方に戻って、続きを見てみますと、
TUNEVALID[arm1176jzfs] = "Enable arm1176jzfs specific processor optimizations"
TUNE_CCARGS += "${@bb.utils.contains("TUNE_FEATURES", "arm1176jzfs", "-mtune=arm1176jzf-s", "", d)}"

AVAILTUNES += "arm1176jzfs"
TUNE_FEATURES_tune-arm1176jzfs = "${TUNE_FEATURES_tune-armv6} arm1176jzfs"
ARMPKGARCH_tune-arm1176jzfs = "arm1176jzfs"
PACKAGE_EXTRA_ARCHS_tune-arm1176jzfs = "${PACKAGE_EXTRA_ARCHS_tune-armv6}"
ここらへんは、arm1176jzfsというタイプを新たに宣言して、
arm1176jzfsだったら、-mtune=arm1176jzf-sを追加するということのようです。

なので、とりあえずこのままhardfpにするだけならば、
local.confで
DEFAULTTUNE = armv6hf
にしてやれば、いいようです。

実際のビルドオプションをビルドログから拾ってみますと、
armv6
  -march=armv6 -mfloat-abi=softfp
armv6hf
  -march=armv6 -mfloat-abi=hard
となっていました。(関係するところだけ)
まぁ、これでもいいんですが、せっかくなんでmfpuとかmtuneとか
つけたくなるのはやむをえないところでしょうか。
ということで、元からあるarm1176jzfsを拡張して
arm1176jzfshfを作ってみました。(みにくい。。。)
diff --git a/conf/machine/include/tune-arm1176jzf-s.inc b/conf/machine/include/tune-arm1176jzf-s.inc
old mode 100644
new mode 100755
index ebad588..194c622
--- a/conf/machine/include/tune-arm1176jzf-s.inc
+++ b/conf/machine/include/tune-arm1176jzf-s.inc
@@ -4,8 +4,14 @@ require conf/machine/include/arm/arch-armv6.inc
 
 TUNEVALID[arm1176jzfs] = "Enable arm1176jzfs specific processor optimizations"
 TUNE_CCARGS += "${@bb.utils.contains("TUNE_FEATURES", "arm1176jzfs", "-mtune=arm1176jzf-s", "", d)}"
+TUNE_CCARGS += "${@bb.utils.contains("TUNE_FEATURES", "vfp", "-mfpu=vfp", "", d)}"
 
 AVAILTUNES += "arm1176jzfs"
 TUNE_FEATURES_tune-arm1176jzfs = "${TUNE_FEATURES_tune-armv6} arm1176jzfs"
 ARMPKGARCH_tune-arm1176jzfs = "arm1176jzfs"
 PACKAGE_EXTRA_ARCHS_tune-arm1176jzfs = "${PACKAGE_EXTRA_ARCHS_tune-armv6}"
+
+AVAILTUNES += "arm1176jzfshf"
+TUNE_FEATURES_tune-arm1176jzfshf = "${TUNE_FEATURES_tune-arm1176jzfs} callconvention-hard"
+ARMPKGARCH_tune-arm1176jzfshf = "arm1176jzfs"
+PACKAGE_EXTRA_ARCHS_tune-arm1176jzfshf = "${PACKAGE_EXTRA_ARCHS_tune-armv6hf-vfp} arm1176jzfshf-vfp"
これで、local.confに
DEFAULTTUNE = arm1176jzfshf
とつけると、こんなかんじのオプションになります。
arm1176jzfshf
  -march=armv6 -mfloat-abi=hard -mtune=arm1176jzf-s -mfpu=vfp
nbenchの結果は別ページに乗せますが(またかよ)、
結果的にはよくなったところもあり、悪くなったところもあり、でした。
この先をやるかどうかは、気分しだいですねぇ。
いちおう、バイナリのサイズは微妙に小さくなっていましたので、
電力消費ぐらいには役に立ったかな?

参考:

0 件のコメント :

コメントを投稿