1月版 GCC 4.0向け最適化開始で2.95はオシマイ


上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2006/1/31

linux-kernelメーリングリスト(以下LKML)かいわいで起きるイベントを毎月お伝えする、Linux Kernel Watch。学生が冬休みに入った影響か、2005年12月は心なしか簡単な内容の質問メールが多かったようです。さて、どのようなことが起きたのか、見てみましょう。

HAVE_ARCH_XXXは悪だ

 Linusは、アーキテクチャ独自の実装を利用するための

#ifdef HAVE_ARCH_XXX
注:HAVE_ARCH_XXXは、汎用の関数を定義する一方、各アーキテクチャ用に最適化されたルーチンがある場合はそれを使うようにする仕組み。例えば、__HAVE_ARCH_MEMCPYなどで利用されている。

という構文には「意味がなく、追跡が難しいため、カーネルソースから追放するべきだ」と主張しました。具体的には、USE_ELF_CORE_DUMP、HAVE_PCI_MMAP、ARCH_HAS_PREFETCH、HAVE_CSUM_COPY_USERなどを例として挙げ、

  • この方式を利用するとコードが見にくくなる
  • 実際に一貫性のない名称が利用されており、特に方式として確立されていないのに慣習として使われている

といった点を問題として指摘しました。

 ではどうするべきでしょうか? Linusは、実装するのなら、Makefileで

obj-$(CONFIG_GENERIC_FOO) += generic-foo.c

のように汎用のコードを読み込むようにし、

#include <asm-generic/div64.h>

のようにして汎用のヘッダを定義するのがよいだろう。その方がgrepなどがしやすいから、と説明しました。

メモリバリアの実装ってどうなっているの?

 ほとんどのCPUアーキテクチャは、読み込んだ順番に命令を実行しているわけではなく、実行可能になった順番で命令を実行しています。「メモリバリア」は、そうしたアーキテクチャにおいて、メモリへの書き込みとメモリからの読み込みの前後関係を保証したいときに使います。例えば、複数のCPUがSMPで動作している場合や外部デバイスとメモリバスを共有している場合に、ほかのCPUに対してメモリに確実に書き込まれていることを確認する際に重要な意味を持ちます。

 メモリバリアの命令を発行すると、その直前まで実行していたメモリに対するアクセス命令が実質的に完了していることが保証されます。ただ、この操作はCPU間の同期などが必要になるため一般的には遅い操作であり、必要最小限に限るのが好ましいとされています。

 カーネル内部には、それぞれの用途に最適化されたメモリバリア命令が多数あります。そのため、「各メモリバリア命令の用途が分からない」という質問をLKMLに投げた人がいました。Paul McKennyはそれに対して、それぞれの命令について簡単に解説しました。

  • wmb
    この命令を発効するまでの、そのCPUにおいて実行した書き込み命令がインターコネクト(具体的には、ほかのCPUから見えるメモリあるいはほかのCPUのキャッシュ)に対して完了していることを保証する

  • rmb
    インターコネクトがその時点で検知している変更は、rmb命令の発行以降、rmbを発行したCPUでは読み込める

  • mb
    wmbとrmbを併せたもの

  • smp_wmbsmp_rmbsmp_mb
    SMPの場合だけwmb/rmb/mbの効果を発生させ、単一プロセッサシステムの場合は何もしない命令

  • read_barrier_depends()
    Alphaのみではrmb、そのほかでは何もしない命令。Alphaのみメモリ読み込みの順番特性に特殊な部分があるため、そこで利用されている

 ここで、「mmiowbという似た命令が存在するのだが、これはどういう関係にあるのか」という議論が発生しました。Roland DreierとJeremy Higdonの解説によると、デバイスのI/Oの際に、スピンロックを保持しながら正しい順番で書き込みをする必要がある場合に、mmiowbを利用する必要が生じることがあるそうです。ただ、スピンロックを取得する動作自体にメモリバリアの操作が含まれているため、スピンロックを取得している場合にもメモリI/Oの順番が保証されないアーキテクチャはAltixくらいだ、と付け加えていました。

mountコマンドの拡張

 以前、プライベートネームスペース(編注)についてお伝えしました。それに関連して、sharedsubtreeがカーネル2.6.15にすでにマージされているようです。これにより、デバイスを複数のネームスペースにわたって同じマウントポイントにマウントする機能などが実現できます。各ユーザー用のディレクトリに名前空間を用意するため、サブツリーを利用して実装するという手法が可能性を帯びてきました。

編注:プライベートネームスペースについては、Linux Kernel Watchの
  「11月版 ドライバに変数を渡すのにうってつけの方法
も参照。

 カーネル側のサポートは準備ができているようです。ただし、対応するmountコマンドがリリースされ、一般的に利用されるようになるにはまだしばらく時間がかかりそうです。ドキュメントには、例としてsmountコマンドの実装例があり、添付のsmountコマンドを利用すればshared subtree機能を活用できるようです。

参考:
カーネルソース内のドキュメント Documentation/sharedsubtree.txt
LWNでの記事 http://lwn.net/Articles/159077/

1/2

Index
Linux Kernel Watch 1月版
 GCC 4.0向け最適化開始で2.95はオシマイ
Page 1
 HAVE_ARCH_XXXは悪だ
 メモリバリアの実装ってどうなっているの?
 mountコマンドの拡張
  Page 2
 GCC 2.95サポート断念とGCC 4.0向けの最適化
 iSCSI+スワップデバイスは危険!?
 mutexの実装は吉か凶か?
 -stableツリーの変化

連載 Linux Kernel Watch


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間