「第67回カーネル読書会のビデオと資料」でnoocyteさんが素晴らしいコメントを寄せてくださっている。
一見の価値ありと思うので、ぜひ見てみて欲しい。
で、僕なりにちょっと補足させてもらうと
まずRISCにおいては mallocは8byte alignが事実上必須だよね。という指摘には完全に同意。
で、POSIXに書いてないのはCISCだと必須じゃないじゃーん。って事だと理解してる。
んで、noocyteさんはプラットフォーム非依存のmallocを書くとしたら、結局RISCの制約に引きずられて8byte align必須になるよねー
という話をしているように見える。
一方、みんな大好き僕らのx86はCISCの子孫なのでミスアラインアクセスが発生してもバスエラーにはならないが、SSE命令は16byte alignされてないと性能でないので、性能を意識するなら16byte alignにする必要がある。
じゃあ、なんで glibc malloc がそうなっていないの?
という疑問が沸くが、これがどうもよく分からない。
元々のdlmallocはlibcとは別の yet another malloc なので、CPU毎に#ifdefするのがイヤで
可搬性を考えて8byte alignにした。というのは十分にありえる話だが、
libc でそれをやる理由は解せない。
昔はSSE命令がなかったので、その時代の名残というセンも考えられるが、
SSE命令の使用頻度まで考えて、メモリ使用効率とのトレードオフまで考え抜いたすえに
8byte alignを選択した可能性も0ではない、と。そういう考え方もあるわけで
いや、実はこの問題は7月にLMSで話をしたときにも指摘されていたので既知の話で
かなり確信犯的に、当日は話をわざとぼやかして
聞かれたら答えるけども、自分からは言わないモードにしたわけだね。
大人って汚いね(^^;
#いいわけしとくと、当日は内容が多かったので時間が押していて
#講師自ら話を脱線させていくのは、厳しい状況だったんですよぅ(^^;;;
と、いうわけで、x86で16byte alignにするパッチを書けば性能改善する余地はあると思うので誰か試してみない?
しかし、かえすがえすも残念なのはnoocyteさんが当日来てくれていたら、その後の宴会で盛り上がれたのは間違いないと確信できるところ。
いつかぜひお会いしたいものである。


にげろーーー、ランキング!
一見の価値ありと思うので、ぜひ見てみて欲しい。
で、僕なりにちょっと補足させてもらうと
まずRISCにおいては mallocは8byte alignが事実上必須だよね。という指摘には完全に同意。
で、POSIXに書いてないのはCISCだと必須じゃないじゃーん。って事だと理解してる。
んで、noocyteさんはプラットフォーム非依存のmallocを書くとしたら、結局RISCの制約に引きずられて8byte align必須になるよねー
という話をしているように見える。
一方、みんな大好き僕らのx86はCISCの子孫なのでミスアラインアクセスが発生してもバスエラーにはならないが、SSE命令は16byte alignされてないと性能でないので、性能を意識するなら16byte alignにする必要がある。
じゃあ、なんで glibc malloc がそうなっていないの?
という疑問が沸くが、これがどうもよく分からない。
元々のdlmallocはlibcとは別の yet another malloc なので、CPU毎に#ifdefするのがイヤで
可搬性を考えて8byte alignにした。というのは十分にありえる話だが、
libc でそれをやる理由は解せない。
昔はSSE命令がなかったので、その時代の名残というセンも考えられるが、
SSE命令の使用頻度まで考えて、メモリ使用効率とのトレードオフまで考え抜いたすえに
8byte alignを選択した可能性も0ではない、と。そういう考え方もあるわけで
いや、実はこの問題は7月にLMSで話をしたときにも指摘されていたので既知の話で
かなり確信犯的に、当日は話をわざとぼやかして
聞かれたら答えるけども、自分からは言わないモードにしたわけだね。
大人って汚いね(^^;
#いいわけしとくと、当日は内容が多かったので時間が押していて
#講師自ら話を脱線させていくのは、厳しい状況だったんですよぅ(^^;;;
と、いうわけで、x86で16byte alignにするパッチを書けば性能改善する余地はあると思うので誰か試してみない?
しかし、かえすがえすも残念なのはnoocyteさんが当日来てくれていたら、その後の宴会で盛り上がれたのは間違いないと確信できるところ。
いつかぜひお会いしたいものである。


にげろーーー、ランキング!
コメント
コメント一覧 (12)
とハードコードしちゃったらいかがざんしょ。
oprofile/Rubyでベンチマークじゃ。
必須なのは
・64bit(以上の)CPU
・32bitかつ浮動小数点ユニットに直接転送というケースの話で、32bitで汎用レジスタにロードしてから処理するタイプだとバスエラーにならないし、データバスが32bitのRISCならペナルティもない、と思っていたんですが、どうなんでしょうか。
「必須じゃないけど8bytesならふつー大丈夫だし文句ないでしょ」という感じで決まった値なのかなあと。
あとなぜ16バイトアラインにしないかという理由ですが、ユーザーデータの前に管理領域を置くとすると、高い確率でキャッシュラインが別になる可能性があるからではないでしょうか。
組み込みCPUではあるけど、glibcのメインターゲットではないですしねぇ・・・
あと、今話しているアラインの話は管理領域込みのブロックの話をしているので、さらにその前に管理領域が、って話にはならないっす(^^;
たとえばx86だったらアライメントまったくしないと言っていますよね?
性能にすごいインパクトありそう・・・
私も読書会参加したかったのですが,関西在住ですから….残念! (古)
最後に東京 (といっても本当の目的地は鎌倉) に行ったのは確か6年前….
私もお会いしたいのですが,いつになったらその機会が来るやら.
読書会,今後もビデオで拝見させていただけるとありがたいです.
といいつつ,実は今回の読書会のことを知ったのは
事前だったか事後だったかよく覚えていない.(^^;
えーっと確か,文字コードがらみのことを検索していてぇ,
hyoshiok さんのページに漂着してぇ,
あたりをうろついていたときに知ったんだったかな.
どえれゃーおもろそうやけど,どーせ遠いから参加でけへんわ,
と思っていたらビデオがあることを知って….
hyoshiok さんのページにコメントした内容については,
もう一度整理して自分のブログに書くつもりです.
そのときにはこちらにもトラックバックさせていただきます.
(もっとも,昨日は長い待機状態が明けて久しぶりに仕事にありついたので,
今後の忙しさによっては最悪週末ぐらいになるかもしれません.(苦笑))
え、SSEの例はユーザーに渡す領域が16bytesアラインされているってことですよね。
そうするとglibc mallocのsizeメンバーは一つ前の前の16bytesアライン領域にいるから、キャッシュラインが別になる確率が上がる、と思ったんですが。
そうですか・・・
では、いずれ関西のイベントででも(*^-^*
fireweedさん>
これは僕の早とちり。もうしわけない
x86話でそれを行間から読み取るのはツラいっすよ(^^;
で、話をもどすと、たしかに現状のようなSSE命令使おうと思ったらアセンブラがほぼ必須の状況だとmemalignするぐらい全然苦にならないと思います。
いつもながら、議論のキレがいいっすね。
でも、現在Intelコンパイラとかが微妙に進めているように普通のC言語のコードからMMX, SSEコードを生成するようになると、コードを書く人はSSEとかをまったく意識していない状況が考えうるので、そのぐらいコンパイラが進化したら16byte alignに変更していくべきかな?
と思いました。
どうでしょうかね?