電車力というものがある。いや、無い。今思い付いた。 _
と思ったが、神によると既にある言葉ということなのでここでは電車カということにしておく。(どうせ二度と言及しないのでどうでもいい) _
目的地まで行くのに、間違えないで電車に乗ったり、スムーズに乗り換えるとかいったような能力を指す。 _
徒歩で通勤するようになってから電車カが落ちたように感じていた。間違えて逆向きの電車に乗ってしまうなんて、空想上の生き物だけが引き起こせるファンタジーだと思ってたんだけど、まあ、何回かやってしまった。(よく使う駅だというのに) _
僕の電車カの衰えを時系列順に並べると以下のようになる。 _
だから何?電車カの衰えはあるので皆さん気を付けましょうという話でした。 _
いや…物事を理解している状態から理解できない状態への遷移とかちゃんと記録してあると面白いのにな…と思う。逆もあって、理解できてない状態から理解してる状態への遷移中はどういう思考をたどってるのか、というか、こっちのほうが興味あるが。 _
人に物を教えるときに、自分は知らなかった時はどういう思考をしてたかが全く思い出せないんだよな。人に教えてるときは、「こんな簡単なこともわからんのか…」とか思うけど、実際自分が理解したときはどうだったかいうのをよく考えて思い出してみると、やっぱり一週間とか数ヶ月とかかけて理解してるものとかがあったりなかったり。 _
それはいいんだが…最近電車通勤しがちなので、電車カは回復しつつある。 _
ところで電車通勤というと、最近、電車のなかでふたりエッチ読んでる人をみかけて、僕が少し電車に乗らなかった間に世間というのは進歩したものだと思った…と思ったが、アレな感じの新聞読む人は昔からいたような気がするのでそうでもないか。ところで電車内でああいう新聞読んでる人って一体…とか思ったが、まあ、人のことをいちいち詮索するのはよくないことである、と考えてしまうのは日本人のよくない点である。 _
例えば推測するに、おうちに帰ると家族がいるので、「さすがに家族の前ではちょっと…」っていう感じだから、電車の中で発散するしかない、という設定はどうだろうか。ひとりぐらしの人間にはわからない苦悩なんだろうきっと。 _
さらに言うなら、ナニなアレの隠しカというのがあって、ひとりぐらししてると、ナニなアレを隠したりする必要が無くなるため、そういうのを隠したりする能力が失われる、というのがあって、デスクトップにアレな画像を置いてしまったりなどする。 _
_ 新入社員の時期になった
この時期になるといつも驚かされるのは、僕がいまだにクビにならずに済んでいるという点である。もう四年にもなるのか…この世に奇跡というものがあるとすれば、それは僕が社会人だというのがそれに該当すると思う。 _
やべー最近虫ふたウルトラstage1で終わるよ。 _
色んな能力が衰えていくという話でした。 _
_ 新世代
そういえばついにリアルで「SVNは使ったことあるけどCVSは使ったことない」人がいた。(というのを知ったのは三週間前の話ブログである) _
そのうち「単一リポジトリってなんですか?」っていう人が生まれたりするのかなー。 _
しかし、CVSやらRCSやらを使ってた時代から考えると(そんな時代知らんが)、まさか、バージョン管理ツールが著名な宗教戦争ネタのひとつに数えられるようになるとは予想だにしなかったよなー(そんな時代知らんが)。 _
読者への宿題:著名な宗教戦争を10個ほど挙げなさい。1個でもいいです。挙げなくてもいいです。 _
_ immutableなOS
リンク先とはあまり関係無いけど…タイトル見て思い出した。immutableなOSというものを考えたりする。たまに。 _
immutableなOSでは、ファイルシステムがimmutableだとする。デバイスはどう扱えばいいかは特に思い付いてない。アプリケーション内(ひとつの閉じた仮想環境内)でのメモリやら変数の扱いはどうでもよいとする。 _
使い方は以下のような感じ。 _
1. 起動すると、一個のディレクトリツリーができる。んで、シェルが起動する _
[1] $
この日記ツール糞か!半角の$が入力できねーぜ!以降、プロンプトはzsh気分でお送りいたします。数字はシェルがいくつ入れ子になってるかを示してます(説明になってない) _
[1] %
2. プログラムを起動すると、そのプログラムがディレクトリツリーに対してどういう副作用を及ぼすか、が帰ってくる _
[1] % cp a b cp a b = {subeffect copy a to b} [1] %
この時点ではファイルシステムは変更されない。コピーは行われない。 _
[1] % x=cp a b [1] % print x {subeffect copy a to b} [1] %
副作用は変数に入れて持ち運べるみたいな感じにする。副作用はapplyとかで適用できる。applyに副作用を渡して、その後にプログラム名を書くことで、副作用を適用したディレクトリツリーの中でプログラムを実行できる。 _
[1] % apply --help Usage: apply SUBEFFECT PROGRAM [1] % apply x shell # <- 副作用x を適用した環境の中でシェルを動かす [2] %
などとする。ここまでしか考えてない。あとは複数のディレクトリツリーをマージして作ったディレクトリツリーの下でプログラムを動かすとかそういう。 _
さて、こうすると何が嬉しいか?何も嬉しくない。こういう「変更できない」というルールは「変更できるハードウェア」を表現するのがすごく遠まわりになるだけなので僕の好みではない(じゃあなんで書いたんだ)。 _
以下の点を考える _
Q. _
1. このOSは使いやすいか? _
2. 柔軟性、堅牢性的な意味でどうか? _
3. 性能はどうか _
A. _
1. 質問が曖昧です _
2. 運用しだい _
3. 効率は既存のおsよりも良くなる。(JavaやHaskellが強力な最適化ができるからCよりも効率が良い的な意味で) _
_ ドラクエ
そういえばドラクエのIとIIをやってなかったのでやってみることにした。とりあえず一日で竜王まで到達した、が、とりあえず世界の半分をもらって、そこでやる気を失ったのが昨日。また来週あたりにやろうと思う。 _
ドラクエI/IIやるのが一番簡単な機種って何かな…とりあえず手元にあるのがGBAだけなのでGBCのやつをやってんだが、今なら携帯のでもよかったか。 _
エミュレータはやってるとなんか虚しくなるのでやらない。 _
GBCって意外と色数あるんだな。記憶ではもっとショボいんだけど、多分スーパーゲームボーイで起動したモノクロのソフトの色数とかの記憶とごっちゃになってる気がする。 _
_ 久し振りにGCCでも弄るか…
と思ったのは既に二週間前の話か(quilt書いてたらへん)。起動するまでに二週間かかるマシンだと思っていただければよろしい。 _
_ 何をやりたいか
条件分岐をなんとかす。 _
アーキテクチャによっては、分岐する命令のちょっと前に分岐先を指定して、分岐ヒントにする、というようなものがある。 _
具体的にいうとCell/B.E.のSPUとか。(というか他に知らん)。 _
結構よくできていて、仕組みは超簡単なのに、ソフトウェアさえうまくなっていれば、分岐ミスを0にできるというもの。 _
hbr branch, target # branchというアドレスでtargetにジャンプするというヒント hoge fuga foo bar nanika doreka branch: bne target
例えば、完全にランダムに、どっちかに分岐するというプログラムがあるとする。 _
if ( nanika_rand_0_or_1() ) { hogehoge(); } else { foobar(); }
この場合、分岐の条件が決まってから分岐命令に到達するまでのところに命令がスケジューリングできるなら、 _
bool cond = nanika_rand_0_or_1(); nanika_shori(); void *target = cond? lableA : labelB; sugoi_shori(); hint(branch, target); totemo_sugoi_shori(); branch: goto *target; labelA: hogehoge(); labelB: foobar();
こんな感じにして条件分岐ミスのペナルティを0にできる… _
…というアーキテクチャになってるのだけど、GCCだとこれが表現できない…ことはなくて、上のようにLabels as Values 拡張使って無理すればできるのだけど、上のだとコードの質が微妙なんだよな。 _
というわけで、なんとかする、という話。 _
_ SPUのコードはどれか。
GCCの4.3.0からSPUが公式でサポートされてます→gcc/config/spu/spu.c。 _
_ さてどうするか
対象コードは以下。最初に無駄なコード入れてるのはbasic blockそれなりに長くするため。あんまり短いと逆効果なので。 _
#include__vector signed int a[16]; int func(int b) { a[0] = spu_splats(0); a[1] = spu_splats(0); a[2] = spu_splats(0); a[3] = spu_splats(0); a[4] = spu_splats(0); a[5] = spu_splats(0); a[6] = spu_splats(0); if (b) { puts("a"); } else { puts("c"); } }
分岐のコードを出してるのは、spu.c:950行目あたり。 _
…さて、ここからどうするか。 _
この処理を以下のように変更したい。 _
分岐の前のbasic blockがある程度の長さ(20命令以上)で、かつ、パイプラインが埋まってないときに、gen_rtx_IF_THEN_ELSEとかしてるのをselbとかにする。 _
RTL的に言うと、 _
(jump_insn 21 20 0 cond.c:14 (set (pc) (if_then_else (eq:SI (reg:SI 146) (const_int 0 [0x0])) (label_ref 0) (pc))) -1 (nil))
こうなってるのを、えーと…どうすりゃいいんだ…RTLが読めないのだった。超適当に書くと、 _
(set (reg:SI 3 $3 (label_ref hoge1))) (set (reg:SI 4 $4 (label_ref hoge2))) (set (reg:SI 4 $4 (reg:SI $3) (reg:SI $4) (reg:SI $5))) (set (pc) (reg $4))
こんな感じ? _
問題: これのjumpしないほうのbasic blockの先頭ラベルが無い。(hoge2) _
_ 簡単に用語解説
abbreviations_and_acronymsこれ読め。 _
うん?上のコードはああなるのか…ちょっと微妙だな…でもこれまた別の問題なので今度(今度ていつだ)。SPUは分岐予測とか無いので、無条件分岐もちゃんとヒント付けないと分岐ミスするのである!! _
_ べーしっくぶろっくのらべるをとろう
どうするか…とりあえず、cfunから辿っていって、線形探索すれば取れそうではある。 _
ラベルが指してるとこの次のRTXはおそらくNOTE_INSN_BASIC_BLOCKだからそこから取る。んで一個戻って、そっちじゃないほうのをとれば…なんか無駄だな。 _
cfgrtl.cとか見ると、start[INSN_UID (rtx)]で取れるっぽいな。と思ったら違った。これそのループの前で調べてんな。 _
アーキテクチャ依存部でbasic block取るのはあんまりやらないみたいだな。i386とrs6000でも一箇所づつしかやってないくらいだからそうなんだろう。 _
_ さてパスでも書くか
アーキテクチャが特定の条件を満たしたら条件分岐を条件mov + 間接ジャンプに置き換えるパスとか書けばいいんか…なんか少々の変更では済まなくなってくるな… _
まあでもIf-conversionとか終わってからのほうがよさげなのでそっちのほうがよさげ。 _
とりあえず、短くて何やってるか理解できそうなdce.c(dead code elimination)とか参考にするか… _
_ べーしくぶろっく巡りかた
basic_block bb; FOR_EACH_BB (bb) { }
で関数中のbasic blockをめぐる。 _
rtx insn; FOR_BB_INSNS (bb, insn) {}
でbasic block中の命令をいてれーとする。命令を消す可能性があるときは、FOR_BB_INSNS_SAFEを使う。 _
ふむ。全くわからんな。→なんというしょうもない間違い。treeのifcvtとrtlのifcvtを間違えていた。 _
code_labelとlabel_refは違う。 _
おえ。なんかsuccsを持ってるbasic blockの終わりはconditional jumpで終われない…のとは違うか。なんかfall thruとかちゃんとしないといかんっぽいな。まあひとことでいうとだるくなってきた。道のりが遠すぎる。こんなの。また来年(多分)!いや、遠すぎないよ。実質やるのこれだけだし…(ほんとか?) _
明日への希望 : force_nonfallthuruのちゃんとした使いかた。あとtablejumpとか参考にしてなんとかする。あとちゃんとテキストにしてまとめるとよい。 _
_ あとの問題は
basic blockを超えて最適化されない。レジスタが余ってて、パイプラインスカスカだったら当機実行とかしてほしい。上のだと、hbrが破壊されなかったら前のbbでやるとか…こっちのほうが簡単かも? _
_ GCC日記
一日で終わった。ちなみにあれは、IBMのだと、 _
if (__builtin_expect(cond,cond)) {}
とかでできる。が、なんか駄目だったので、あれを書いた次第なのだけど、もう一度見直してみたら、全然駄目じゃなかったのでどうでもよかった。 _
_ 俺と客
今のお客さんはリアルではほんの数分くらいしか会ったことないのだけど、Unreal Tournament(Tournamentが書けない)をやってるとかの影響で5回くらい殺しあったことがある。最近はCOD4とか気味。 _
(そういえばなんで出向してるのにお客さんに会ってないんだろうか…) _
さて大阪にでも行くかと思ったら既に新幹線終電だった。新幹線終電は9時20分ぐらいなので覚えておくように。 _
_ 今日のメモ(おとといだが)
携帯電話は電池残量少なくても一日我慢すると思いがちだが、それは、電話かかってきたときに困ります。 _
_ どうでもいいから
LANケーブルを引っこ抜け!!!!!!!!! _
_ とにもかくにも
引っこ抜KEEE。 _
_ 結局web見てた
ん。四月おわった。 _
_ 29日の件
一応作ったのもったいないので置いておく _
http://morihyphen.hp.infoseek.co.jp/files/shesellsshells.tar.gz _
何のことかわからない人は多分見てもわからないと思うので放置でよいです。使いかたは、 _
適当なTTFをfont.ttfとして置く。 $ make -C npr $ make $ ./main
多分Linuxでしか動きません _
とりあえず若かったなとか的な。 _
作業してて人の話聞いてないのが定番になりつつあるので次々回ぐらいにはなんとかしたい。 _
収穫としては、やる気出ないときは絵から始めるとよいのがわかった。 _