2006年7月アーカイブ

行き着いた先はやはりアセンブラ。

---

一昨日の続き
結局アルゴリズムの変化による性能の変化を調べたいので今アセンブラのステップ数調べてもアルゴリズムを変更するたびに紙で追うのか!と言う話になったので、前のエントリのコメントでbona先生が紹介してくれたrdtsc命令について調べることにした。

rdtsc命令...(read-time stamp counter の略らしい)
Wataru's memo 2003-10-01 (Wed)の日記の説明が分かりやすい!

余り知られていないが、Pentium 以降の x86 シリーズは、クロックレベルの解像度を持った64ビットカウンターを内部に有している(MSR: Model Specific Registers のひとつ)。この超高精度カウンターは、電源ONでゼロリセットされ、CPU 稼働中は1クロックサイクル毎に1ずつインクリメントされる。RDTSC 命令は本カウンターの現在値を EDX/EAX レジスターペアに格納するための命令である。

んでこの命令の活用例。yosirin-helloさんこのページのソースを使ってみた。

LARGE_INTEGER cycles;


__asm {
cpuid
rdtsc


mov cycles.LowPart, eax // (1)
mov cycles.HighPart, edx
}


// 関数の呼び出し


__asm {
cpuid
rdtsc


sub eax, cycles.LowPart // (2)
sub edx, cycles.HighPart


mov cycles.LowPart, eax // (3)
mov cycles.HighPart, edx
}


printf("関数が消費したのクロックサイクル数 : %d [cycles]", cycles.QuadPart );

cpuid命令も出さないとちゃんとした値を返してこないそうな。
MSのvc++とかで開発しているのならwindows.hのincludeが必要。
ただ、自分の環境の場合32bit幅で出力されてしまい、あっという間にオーバーフロー起こして負の数になってしまった。これは後でチェックしておこう...。
ちなみに上のソースをまんま実行してみたところ、Athlon64 3000+(実クロック1.8GHz)で60-70クロックぐらい消費していた。上記以外、何も実行してないのでほとんどオーバーヘッドがない状態だがそれでもクロックは僅かに進んでいるのが確認できた。わずか(平均して)65/1,800,000,000≒36.1ナノ秒の出来事ではあるが...。


とりあえずインラインアセンブラの部分を関数化して(多少コレでオーバーヘッドが生じそうだが...)各GAのオペレーターに挟んでその結果をcsvで出力するところまでして今日は終了。
しかし、おおもとのGAのプログラム、元々激重なnearest insertion(以下NI)の評価がメインなので評価対象としてNIを使わない素のGAを作らなければならないという問題が...。長期戦になりそうです(´・ω・`)


---


話をrdtsc命令に戻す。
家に帰ってから思ったのだが、(当たり前の話だが)AMD64っていうからには64bitではないかと。
上の方で当然のごとく32bitで扱っていたがいいのかと。


アセンブラは大学の授業でちょろっとかじった程度でほぼズブの素人なのでまずはその辺を調べてみた。

とりあえずAMD64アーキテクチャの確認
http://hp.vector.co.jp/authors/VA003988/asm2.htmより

32ビットレジスタ
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI,R8D,R9D,…,R15D

EAX,EDXは32bitなまんまなのね。よかったよかった。

更にnetで調べてたら良記事発見!
組み込まれたエンジニアさんの2006-02-15の記事より

64ビットの値を受け渡すのには、IA32ではEAX/EDXのペアでデータを渡すようにしているのであるが、64ビットアーキテクチャのAMD64が普通にC言語から64ビットデータを取得する時には、当然ながら1つのレジスタで読み出せるのである。


その部分が、トラブルの種になる。
RDTSC命令は、IA32との互換性を考えて、AMD64でもEAX/EDXペアにカウント値を読み出すので、64、32ビット共用の読み出し関数はこの点を考慮しないといけない。

なるほど、結局Athlon64使っててもEAX/EDXが32bitだから上の方のソースで問題ないわけですな。ただ同記事で指摘されているように、実行するときにCool'n'Quietはoffにしておかないとなぁ...。クロックの動的変化を思いっきり忘れていました。

買ったのはコレ

Nightwish Wishmaster(amazon)
NIGHTWISH.jpg


ネトゲー経由で知ったのだが、コレはイイ!特にFantasmicという曲がイイ(´Д`*)
エレキギターとソプラノ・ヴォーカルって合うんだなぁ...。
#youtubeで検索してみたらあったし。試聴してみたい方はどぞー。

Rockでここまで自分の波長にあったのはDeep PurpleのAnya以来かもしれない。基本的にいかにも...なヤツが大好きです。


あ、あとハイスクール奇面組1~3巻も一緒に買った。マターリ読んでます。

アセンブラ

| コメント(2) | トラックバック(0)

約1週間ぶりに研究室に行きまして、机の掃除をようやくした。
随分綺麗になったかな。


掃除も終わって、まったり過ごすかなぁと思ってたら教授からヘビーなタスクを割り振られた。
なんでも現状のGAのCプログラムにおいて、(アセンブラのコードで)1世代平均何ステップ実行しているのか求めて欲しいと。単純に実行時間が短かくなればステップが減ったという根拠にはならないかなぁと思ったがメモリのキャッシュもあるし、論文に載せる以上そういう根拠となるデータも欲しいとのこと。(´・ω・`)

とりあえず今日はアセンブラのコードをコンパイラに吐かして、Cのみのソースとともに紙にプリントアウト。アセンブラ得意なdesutanと共にCのソースをアセンブラ何ステップか紙のほうに書き込み。(我ながらやってることがローテクだなぁと思うが、参照はディスプレイ、書き込みは紙の方が優れているんじゃないかなぁと思ってる。)

一応この作業を途中までやって今日は終わり。木曜はコレの残りと確率計算だなぁ...。うまくいけるか未だに不安ですが。

---

アセンブラのソースを見ていると色々なところで新しい発見がある。
例えば、もはやコーディングの悪例として名高いグローバル変数。
あれって普通の変数同様に使用する場面になったらその場で参照されるのだろうと思ってが、レジスタに余裕があるときはグローバル変数を使う関数を呼び出す段階で参照するのね。アセンブラのソースを見て、初めて知った。

後は
int i=j=0;
みたいな2変数の初期化。
素直に2回初期化作業をするのかなと思ったが、ところがどっこい、xorを使って1ステップで済ましてる。

普段コードを書いてるとこの辺のことは全然意識しないが、実際にアセンブラのソースをみるとなかなか熱いことをしてる。そんなことに気づいた一日であった。

再びphpの話。そうです、またやることになったのです。
まぁでも2-3月にやってた内容と比べると今回の機能追加は楽かな。

Ethnaのsessionにオブジェクト突っ込むと復元できないって
前にsiがはまってたのに、自分も同じことをやってしまった。orz 
わざわざデータクラスを作った意味がない。

明後日はまずmodelクラスの方でactionform渡したらarray(というか、hashだよなぁ、phpの場合)を返すようなmethodを作ることにしよう...。


---
おまけ
AMD、ATIの買収を発表
AMDがATI買収を正式発表

以前から噂にはなってたけど、ついにって感じだなぁ。
AMDは多分本気でコプロ路線を考えているのでしょう。もしかしたらGPUがソケット化される日も来るのかもしれない。

(前略)非常にね、 熱い、 命名を、 やってくれました

C:\Program Files、 空白スペースをつける、 熱い命名をした、 MSの中の、 技術者? 

でてこいやぁ!

cd コマンド

| コメント(0) | トラックバック(0)

unixを弄ってる人ならもう腐るほど打ち込んでいるであろうこのコマンド。

cd - とか打ち込むとブラウザボタンで言うところの一個前に「戻る」動作になるが
今日初めて数段先まで戻ることも可能だということをirc経由で知った。

zshの場合、単純にcd -[数値]とやれば数で指定した分だけ前のcd結果が反映されるのだが、その前にシェルの設定が必要っぽい。(他のシェルでは出来るのかなぁ?デフォ状態のtcshでやったら怒られた。もしかしたらzsh限定なのかもしれない。)


参考元:zshの設定

# cdでpushdする。
setopt auto_pushd


# pushdで同じディレクトリを重複してpushしない。
setopt pushd_ignore_dups

この2つを追加してcd -うって、tabキー押すと...
通常の補完リストのように画面の下部分に履歴リストが出てメチャ便利!

最近巷で流行の(?)メイリオフォントというヤツを入れてみた。(参照元:caramel*vanillaの記事)
時期windowsのvistaにはコイツが標準ではいるらしいね。

ちなみにメイリオフォントを入れてスラドを見るとこんな感じ
meiryo_test.jpg

eclipseでプログラミングとかするとこんな感じ(研究でやってるGAのプログラムの一部を抜粋)
meiryo_test2.jpg


以下、自分なりの感想を...
・雰囲気としてはGnomeを使っていたときに似てる。気分替えにはイイ。
・液晶に反射シートを使ってるせいなのかは分からないが、若干ぼやけた印象を受ける。
・欧文、和文の調和がとれてて見やすい。が、 <や>、=が大きすぎでちょっとカッコワルイ。
・やけにダイアログがでかくなる。
・XGAで文字が大きくなるはしんどい。

やっぱ世の中SXGAがもはや標準なんでしょうか?
XGA環境じゃちょっと狭い印象を受けてしまったが、SXGAとかなら大いにこのフォントはアリなんじゃないかなぁ。
研究室の方は19インチの液晶なので今度行ったときにあっちにもメイリオ入れてみっかなぁ。

bugを探せ

| コメント(2) | トラックバック(0)

そんなわけで今日はバイト先でテスト環境では再現しないbugの原因究明をしていました。


si曰く、スーパープログラマーな方々が作ったソースと言うだけあって結構キてました...。(´Д`ι)
メール関連の不具合だったのですが、bug云々以前に元々のプログラムが一体どこでどうメールを発射してるのか全然ワカランかった。その後の流れとしては...

結局流し読みはダメだぁ!!と言うことで真剣にソースを追い始める→データと処理が別クラスとして完全に分離されてることにようやく気づく→流れ把握→とりあえずbug再現しようと試みる→数回ほど再現→更にソース読んでロジック上、場合によっては起こり得ることが発覚。(*゜∀゜)

対策は後日ということで(´・ω・`)

---

んー、GoFのVisitorパターンのように処理とデータを完全に切り分けてる部分って事前に「この辺の部分はこうなっている」と知ってればすごく綺麗(かつ合理的)に見えるのだが、そんな風になってるとは知らずに流し読みしてしまうとハマってしまうなぁ。肝心なところが見落としがちになる。

データ部分だけ注目してしまい、「はて、処理的にコイツが呼ばれるのは間違いないが、コイツはどこでいつ呼ばれてるんだ?」と、悩んでしまう自分が居ます。method名で検索してもすげーhitするし(´Д`;)


結局一から読むのがめんどくてついつい流し読みしてしまうのが原因だったりする。
まだまだ他人のソースを読む力が自分にはない!もっと精進しないとなぁ。

http://japanese.engadget.com/より、
参考元:マリオスープ

mario_disassemble.jpg

左:エキサイトバイク
右:スーパーマリオブラザーズ
の逆アセンブラしたコードにジャンプ先などを加筆したモノ。

やっぱり当時はアセンブラで直にコードを書いていたのだろうか?
逆アセンブラだからoriginalとは多少違うと思うけど、スーパーマリオブラザーズはエキサイトバイクと比べるとスゲェ複雑なんだなぁ...。

ウチの教授はよく、昔のプログラミングは職人技だったんだよとおっしゃっているが、
ここまでいくと職人技というのも頷ける。

久々に休日

| コメント(0) | トラックバック(0)

最近のオレは週休0だから困る。

さて、久々に休日を過ごしたわけですが。
やったことといえば...。

・散髪
・部屋の掃除

以上。やっぱり休日をまともに過ごせないな自分は_| ̄|○
もっとやりたいことがあるはずなのだが。


最近再びPerlに回帰しようとEffective Perlを読み始めた。どうも最近は本の読み進みが遅い。
夏休み中に今読んでるBSD hacksとEffective Javaを読み終わらせたいなぁ。

バイトが夜の7時前に終わってそっから家に帰って急いでご飯&お風呂を済ませて大学へ。

何気に夜9時の木下街道は混んでいた。上りはガラガラなのになぁ...。
大学到着後、何をやっていたかというと~

あとレポート1つだけだというのに、その1つがなかなか終わらない。( ´・ω・`)

とりあえず今日はバイトが終わったら学校に行って徹夜しようかなぁ。

---

問題はその次の金曜日だ。レポート提出したらおしまいだから帰ってもいいのだが、土曜に講義があるんだよねぇ...。
金曜も泊まってしまうか_| ̄|○

正直、家よりも研究室の方がクーラーがきいてて、最近じゃ家よりも心地よく寝れてしまう。困った困った。

tetris

| コメント(0) | トラックバック(0)

よく出回ってるTGMのスーパープレイを上回るモノをyoutubeで発見。


TGM3が既に出ていたらしい...。

ノーマルモード

終始高速

あまりの速さに絶句(´A`;)

発表終了

| コメント(0) | トラックバック(0)

とりあえずなんとかこなせました。
同じ院生さんからの意見を見ても割と好意的なのが多かったのかな。


明日は早起きして銀行→ガソリンスタンド コースです。今度は擦らないように気を付けます(´Д`;)

ガソリンスタンドで車こすりました(´Д`ι)

土曜当たりに車屋行ってみて貰うことにしたけど修理費いくらするんだろう。
デジカメ買おうかなぁと思ってたがしばらくお預けっぽいですorz

明日はいよいよ発表だなぁ。なじられないよう頑張りますλ...。

この間、風邪をひいてしまったわけだけれども、未だに咳だけが治らないので午前中に内科の先生に見て貰ってきた。

中学の時に喘息の気があると診断されたことがあるので少し心配だったのだが、レントゲンを撮って確認した結果、ただの咳と診断された。よかったよかった。


レントゲンの撮影中、看護婦さんに脇腹触られまくって「痩せてるー!」とか言われてしまった( ´・ω・`)
薬局で体脂肪率を計るマシーンがあったので久々にやってみたら5%(´A`)
大昔に計ったときは7%ぐらいだったから、更に落ちとる。
標準が20%だからなんとかしないとなぁ...。


んまぁ体格云々よりも、まずはこの咳を取っ払ってしまわなければ...。

このアーカイブについて

このページには、2006年7月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2006年6月です。

次のアーカイブは2006年8月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

OpenID対応しています OpenIDについて
Powered by Movable Type 4.261