電子辞書Brainをいじる (4) Brainuxでアプリをインストールして遊ぶ – ARMv5 (Brainux) 用ビルドオプション最適化テンプレート

Debianのビルド時

以下の行を

# ==============================================================================
# ARMv5 (Brainux) Switchable Optimization Template
# ==============================================================================

# ------------------------------------------------------------------------------
# [1] Basic flags (base optimizations applied even during test builds)
# ------------------------------------------------------------------------------
export DEB_CXXFLAGS_MAINT_APPEND = -march=armv5tej -mtune=arm926ej-s -marm -Os -fomit-frame-pointer -fno-strict-aliasing -fno-tree-vectorize -fno-aggressive-loop-optimizations -fno-strict-overflow -mfloat-abi=soft -ffast-math -falign-functions=2 -fno-finite-math-only
export DEB_LDFLAGS_MAINT_APPEND  = 
export DEB_BUILD_MAINT_OPTIONS   = hardening=+bindnow

# ------------------------------------------------------------------------------
# [2] Ultra-powerful finalization flag (Resource-intensive; for LTO production use)
# When performing a build check (test),
# please comment out the two lines below by adding a "#" at the beginning of each.
# ------------------------------------------------------------------------------
export DEB_CXXFLAGS_MAINT_APPEND += -ffunction-sections -fdata-sections -flto -fno-lto-odr-violations
export DEB_LDFLAGS_MAINT_APPEND  += -Wl,--gc-sections -Wl,-s -flto -flto-partition=max

# ------------------------------------------------------------------------------
# [3] Final assignment (*Must be placed at the very end)
# ------------------------------------------------------------------------------
export DEB_CFLAGS_MAINT_APPEND = $(DEB_CXXFLAGS_MAINT_APPEND) -Wno-implicit-function-declaration

【1】基本フラグ群(CPUとメモリの特性に適合させる)

ハードウェア(i.MX283、ARM926EJ-Sコア)の素の能力を最大限に活かし、無駄な計算を徹底的に省くためのベース設定です。

  • -march=armv5tej
    • 意味: 「ARMv5TEJ アーキテクチャ用の命令(機械語)を使え」という指示です。
    • 効果: 電子辞書のCPUが理解できる「道具箱(命令セット)」を正確に指定します。これより新しい世代(ARMv7など)の命令が混ざってアプリがクラッシュするのを防ぎます。
  • -mtune=arm926ej-s
    • 意味: 「電子辞書のCPUコアの内部構造に合わせて、最も効率の良い順番に命令を並び替えろ(スケジュール最適化)」という指示です [3.2]。
    • 効果: 計算結果を待つ間の「CPUの手待ち時間(パイプライン・ストール)」を回避するように機械語の並び順を調整するため、サイズを増やさずに実行速度を底上げします。
  • -marm
    • 意味: 「Thumbモード(16bit)ではなく、常に純粋な32bitのARM命令モードでコンパイルしろ」という指示です。
    • 効果: 1回に実行できる計算能力を最大化し、複雑なグラフィック処理やループ演算のパフォーマンスを向上させます。
  • -Os
    • 意味: 「実行速度を落とさない範囲で、バイナリサイズ(容量)が最も小さくなるように最適化しろ」というサイズ最優先の指示です。
    • 効果: 電子辞書CPUの「極小のL1キャッシュメモリ」にプログラムを丸ごと収めます。遅いメインメモリ(DDR2)へデータを読みに行く回数が激減するため、速度優先の -O3 よりも実効速度が速くなります。
  • -fomit-frame-pointer
    • 意味: 「関数を呼び出すたびに、デバッグ用の足跡(フレームポインタ)を残すのをやめろ」という指示です。
    • 効果: 貴重なCPUのレジスタ(計算用の作業机)が1つ丸ごと空きます。利用可能なレジスタが増えるため、関数の実行スピードが向上します。
  • -fno-strict-aliasing
    • 意味: 「ポインタの型に関する厳密な最適化ルールを無効化し、安全第一でコンパイルしろ」という指示です。
    • 効果: 古いC/C++ソースコードで発生しやすい「最適化による意図しないメモリバグや異常終了」を完璧に防止します。
  • -fno-tree-vectorize
    • 意味: 「ループ処理を並列化(ベクトル化)しようとする自動最適化を禁止しろ」という指示です。
    • 効果: ARMv5には並列計算用のNEON(SIMD)命令がありません。効果がないどころか、バイナリを無駄に肥大化させてキャッシュミスを引き起こす元凶をあらかじめカットします。
  • -fno-aggressive-loop-optimizations
    • 意味: 「ループ処理に対する、コンパイラによる過剰で攻撃的な推測・最適化を禁止しろ」という指示です。
    • 効果: 近年のgccが「このループはバグに違いない」と過剰に解釈してコードを勝手に書き換えてしまうバグを回避し、古いコードを安全に動作させます。
  • -fno-strict-overflow
    • 意味: 「数値が上限を超えたとき(オーバーフロー時)の挙動を、コンパイラが『起きないもの』として最適化するのを禁止しろ」という指示です。
    • 効果: サイン付き整数の計算において、最適化によってループが途中でスキップされるなどの予期せぬ不具合を防ぎます。
  • -mfloat-abi=soft
    • 意味: 「浮動小数点(小数)の計算をハードウェア(FPU)ではなく、すべてソフトウェア(整数演算の組み合わせ)で処理しろ」という強制指示です。
    • 効果: 電子辞書のCPUには高速な小数の計算機(FPU)がありません。この指定により、小数を多用する計算が最も軽量な整数演算ベースのアルゴリズムへ確実に置き換わります。
  • -ffast-math
    • 意味: 「数学的な厳密さ(IEEE規格)を完全に無視して、とにかく最速で小数の計算を終わらせろ」という速度特化フラグです。
    • 効果: NaN(非数)や無限大のチェックなどをすべて省略し、2Dグラフィックの座標計算などを極限まで高速化します。
  • -falign-functions=2
    • 意味: 「関数の開始位置(アドレス)の隙間をギチギチに詰め込んで配置しろ」という指示です。
    • 効果: 関数の頭を揃えるために自動で挿入される「無駄なパディング(空きスペースのゴミデータ)」を完全に排除し、バイナリサイズをさらに縮小させてキャッシュ効率を極大化します。
  • -fno-finite-math-only
    • 意味: 「-ffast-math の暴走を抑える安全弁」です。
    • 効果: 近代的なgcc(Debian 13世代)で -ffast-math と後述の LTO が合わさった時に発生する、ループ計算の最適化バグ(無限ループやクラッシュ)をピンポイントで安全に防止します。
  • hardening=+bindnow
    • 意味: 「アプリが起動した瞬間に、外部ライブラリのすべての関数位置を完全に確定・ロックしろ」という設定です。
    • 効果: 本来はセキュリティ用ですが、実行中に新しい関数が呼ばれるたびに発生する「一瞬の探索(名前解決)による画面のカクつき・プチフリーズ」を完全に予防します。

 

【2】超強力な仕上げフラグ群(不要なコードの完全間引きとパズル的最適化)

コンパイルの難易度は上がりますが、パッケージの容量を劇的に減らし、ファイルの壁を越えた最適化をかけるための「本番専用セット」です。

  • -ffunction-sections / -fdata-sections
    • 意味: 「関数やデータを、ファイルごとに細かく区切られた個別の部屋(セクション)にバラバラに配置しろ」という指示です。
    • 効果: 単体では意味がありませんが、後述の -Wl,–gc-sections と組み合わせることで、不要なコードを部屋ごとゴミ箱に捨てるための下準備をします。
  • -flto
    • 意味: 「リンク時最適化(Link Time Optimization)を有効にし、プログラム全体を一つの巨大なパズルとして俯瞰して最適化しろ」という強力な設定です。
    • 効果: 別のファイル(.c)同士であっても、頻繁に呼ばれる関数を直接メイン処理の内部へ埋め込む(インライン展開)など、CPUにとって最も重い「関数の呼び出し・戻りのロス」を完全に消滅させます。
  • -fno-lto-odr-violations
    • 意味: 「LTOの全体チェックの時に、古いコード特有の『わずかな型の宣言の不一致(ODR違反)』を見つけてもエラーでビルドを止めるな」という救済フラグです。
    • 効果: 古いSDLやツールを、近代的な厳しいコンパイラでエラー落ちさせることなく、安全に完走させてパッケージを完成させます。
  • -Wl,–gc-sections
    • 意味: 「一度も呼び出されていない、死んでいる関数やデータをバイナリから物理的に切り落とせ(ガベージコレクション)」という指示です [3.2]。
  • *
  • • 効果: 今回無効化したOpenGLの残骸など、不要なコードを一滴残らず消去して中身を極小化し、CPUキャッシュのヒット率を最大に高めます [3.2]。
  • -Wl,-s
    • 意味: 「実行に関係のない、デバッグ用の関数名や文字情報をバイナリから完全に剥ぎ取れ」という指示です [3.2]。
    • 効果: コンピュータの実行には1バイトも必要のない「ただのテキストデータ」を一掃するため、ファイルサイズ(容量)が劇的に縮小します [3.2]。
  • -flto-partition=max
    • 意味: 「LTO全体の巨大なパズルを解く際、データを小さく細分化して1つずつ処理しろ」という指示です。
    • 効果: 完成後のアプリの実行速度は最高性能を維持したまま、ビルド中(コンパイルの最終段階)の電子辞書実機のメモリ(RAM)の消費量だけを大幅に下げて、メモリ不足(Killed)によるビルド失敗を防ぐ防波堤になります。

 

【3】最終代入(C言語への反映)

  • export DEB_CFLAGS_MAINT_APPEND = $(DEB_CXXFLAGS_MAINT_APPEND) …
    • 意味: 上記で組み立てた完璧な共通最適化フラグを、そのままC言語(CFLAGS)側へ丸ごとコピーします [3.2]。
  • -Wno-implicit-function-declaration
    • 意味: 「関数の事前の宣言(プロトタイプ宣言)が抜けたまま呼び出されていても、エラーにしてビルドを止めるな」というC言語専用の指示です。
    • 効果: 近代的なgcc(Debian 13)の厳しすぎるルールによって、古いC言語コードが強制終了するのを防ぎます。C++(CXXFLAGS)にこれが混ざるとコンパイラが怒って止まってしまうため、このようにC言語側にだけ最後に付け足す形をとるのが、 Makefileとして最も美しく正しい書き方になります。

Views: 1

カテゴリー: 未分類 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です