[M+ OUTLINE FONTS 562] make -j N での並列処理時の問題および split-svg.pl のマルチスレッド化について

Back to archive index

Masato Hashimoto cabez****@gmail*****
2010年 5月 22日 (土) 18:40:30 JST


はじめまして、橋本と申します。
いつも M+ FONTS を使わせていただいています。

この度は、現状のフォントのビルドにおける問題の報告と、それへの対処や改善
について提案させていただきたく思い投稿させていただきました。
ちょっと長いメールになりますが、お暇な時に読んでください。

私はビルドに関して以下の2点の問題を感じておりました。

1) Makefile の問題

現状では、make -j4 というふうにジョブを並列実行させると make が失敗します。
これはルールの中に依存関係間で依存関係が存在するものがあるためです。
具体例をあげると、

all: split-svgs ttf

の場合、ターゲット ttf の実行時には split-svgs が完了していなければいけ
ないところが同時に実行されるため、ターゲット ttf は正常終了しません。
(実際にはそれ以前のところでエラーになります) 。

2) ビルド時間の問題

すべての処理がシーケンシャル前提なので時間がかかります。

これらの対処や改善を行うための修正を行ってみました。
修正したファイル (Makefile と split-svg.pl) を添付します。

1) Makefile への修正

並列実行に対応できるよう修正しました。

2) 時間短縮のための改善

Makefile において、各フォントのビルドをフォントごとに別ルールに分けて並列
に実行できるようにしました。

split-svg.pl において、スプリット処理をマルチスレッド化しました。
並列処理数を split-svgs.pl の第一引数に指定することでその数だけスレッドが
生成されます。現状第一引数が数値でない場合は 1 スレッドだけ生成するように
しています (2 くらいでもいいかも)。
このために Makefile で変数 SPLIT_CONCURRENCY を用意しました。

make SPLIT_CONCURRENCY=4

のように指定すると、split-svg.pl への第一引数に 4 が渡されます。未指定なら
現状 1 が渡されます。
*nix な環境で環境変数 MAKEFLAGS に "-j4" などと日頃設定されている方なら、

make SPLIT_CONCURRENCY=`echo $MAKEFLAGS | sed -n "s/.*-j *\([0-9]\+\).*/\1/p"`

でいけるはずです。

※問題点というか積み残し事項

make rebuild-ttf にも依存関係問題があるのですが、こっちは手をつけていま
せん (ちょっとややこしい)。ていうか rebuild-ttf って必要?

※注意点など
私はプログラマでもなんでもなく、日頃シェルスクリプトをいじる程度で
Perl も素人同然なので、無駄のあるコードかもしれません。
Core i7 などでスレッド数を 8 とか 9 とかにしたら、ディスクアクセスが
ボトルネックになるかも。

私のマシン (C2Q Q8200、Arch Linux x86_64) で make -j4、スレッド数 4 で
ビルドした時の time の値は以下のようになりました (他のことしながらビルド
した時間なので、あまり正確ではありません)。

■現状
real	37m0.781s
user	36m0.669s
sys	0m28.308s

■修正後
real	12m55.003s
user	38m26.623s
sys	0m30.795s

coz さんの現行機だとあまり効果がないかもしれませんが :-)、みなさんに内容を
確認していただき、ツッコミなどあればお聞きかせいただければと思います。
そして問題がなくなったら適用していただけたらと思います。

以上、よろしくお願いします。
-- 
HASHIMOTO, Masato
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: mplus-build-update.tar.bz2
型:         application/octet-stream
サイズ:     1915 バイト
説明:       無し
下載 



mplus-fonts-dev メーリングリストの案内
Back to archive index