いろいろいじりたいがあまり時間をとれない. とりあえずmprotectの第二引数はpage sizeの倍数になってなくてもいいことを確認した(
mm/sys_mprotect.c).
len = PAGE_ALIGN(len);
・
Xbyak 2.02修正した.
・↓
4の問題は結局はローカルラベルをサポートしていないことによる.
そのための情報はVC++なら
__FUNCSIG__,
gccなら
__PRETTY_FUNCTION__で取得可能(C90の__func__だと情報量が少ないのでC++では使えない).
だが, これらはメソッドのデフォルト引数には使えないようだ.
つまりjmp("lp");としたときにjmp("lp", __FUNCSIG__);とさせられない. となるとマクロを使うことになるがLなんてマクロを定義したくないし全ての分岐命令のマクロも用意したくない.
さてどうしたものか. ばっさり諦めるべきかなあ.
・
これひょっとしてダメか
本当だ. ご指摘ありがとうございます.
mprotectの第二引数はページサイズに丸める必要はなかったのか. 余計なことしてバグったってやつだな.
・手作業での2.4から2.6移行は無謀かなあ. なんだか泥沼状態.
ちょっとまじめ(アルゴリズムの改良) + せこい(マルチコア) + ネタ(busy loop)で最高記録達成. 来月のペアリングフォーラムで喋るか.
futexで実装しようと思ったが我が家のメインLinuxマシンのカーネルは2.4系列(一応ほぼ最新)でそんなもん無かった.
ええ加減新しいのを入れた方がさくっと便利なのは分かってるのだが(2.4はgcc4でコンパイルするのも大変だ), いろいろいじって愛着があって馴染んでるので使い続けてる. どうしよう.
・busy loop調節したら60%ほど速くなった. なかなかの好成績. 計算直前にthread起こすようにしたら1割遅くなった.
それでも上出来かな. ただLinuxではもとより遅くなった. あとWindowsのEVENT相当はfutexを使って実装すればええんかな. 意外と情報少ないなあ.
・
Xbyak2.01に@@, @F, @Bを追加してみた(適当Ver)
入れようと思ったんやけど
void func1()
{
L("@@");
...
jmp("@f");
}
void func2()
{
L("@@");
func1();
jmp("@f");
}
ってしたときの挙動が分かりにくいバグを招きかねないなあ. どうしよう.
週末から風邪引いて辛い.
OSのコンテキストスイッチよりも細かいタイミングで同期を取りたい場合はbusy loopで回すしかないんだろうか.
void *para_;
void (*func_)(void*);
void threadEntry() /* 別スレッドで待機 */
{
do {
while (state_ == WAIT) _mm_pause(); // busy loop
func_(para_);
_mm_sfence(); // storeのシリアライズ
state_ = WAIT; // stop
} while (state_ != QUIT);
}
/*
本体
func(para1)とfunc(para2)を別々のCPUに計算させる
*/
void calc(void *para1, void *para2, void func(void*))
{
para_ = para1;
func_ = func;
_mm_sfence();
state_ = RUNNING;
func(para2);
while (state_ == RUNNING) _mm_pause();
}
まあ実際には使えないだろうけど速度命の場合はこんな感じ?
YAPC::Asia 2008に行ってきた.
会場のあまりの寒さに体の調子がおかしくなる.
私が行ってた大学では大講義室でも天井にほこりを舞い散らすだけの扇風機があっただけな気がするが.
贅沢というか時代に逆行してるというか.
天気がよくてキャンパスの芝生でひなたぼっこできたのがせめてもの幸い.
やっぱ疲れてるのかな. 昨晩の地震に気がつかなかった.
・64bit Lniuxでは呼び出し直後の[rsp]~[rsp-128]はrspを変更しない限り呼び出された側で自由に使ってよい領域(red zone)らしい. 割り込みハンドラでそこを使わないことが保証されている.
末尾の関数(そこから何も呼びださない)ときはスタックをいじらなくても多少はそこに退避できるというわけだ. Power PCにもred zoneはあるが64bit Windowsにはないみたい. 残念.
・気がついたらゴールデンウィークが終わってた. めっちゃ眠くてしんどくてひたすら寝ていた.