view Changes @ 12:7f2db1e1bf2f default tip

use CBC_COMPILER environment val
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 04 Jul 2019 18:53:38 +0900
parents d4bc23cb728b
children
line wrap: on
line source

Sun Sep 10 08:19:53 JST 2006

あれ? cmp_memory1 では、アドレスを識別しているので、(comment とは
反対に...)  アドレスが異なるメモリパターンはshare されてないね。
こまったものだ。

copy_memory の呼び出す、memory_lookup を書き換えないとだめだな。

state.c/h は、必要ないみたいだな。

state 間のpointer を用意した方があとで実行させてみる時には
便利だろう。(実行って言うのかな? これは、なんだろう? trace 
generation? )

Sun Sep 10 05:09:02 JST 2006

1.6MHz 17inch PowerBook Memory 1GB

+leo+kono time ./tableau 8 > ers; tail ers
./tableau 8 > ers  237.58s user 12.92s system 79% cpu 5:16.63 total
found 3915727
no more banch 3915727
All done count 3915727
        memory_header 11747304
        memcmp_count 830530587
        memory_body 1792
        restore_count 82230288
        restore_size 1096403840
        range_count 24
        range_size 320
+leo+kono time ./tableau 7 > ers; tail ers
./tableau 7 > ers  35.42s user 1.99s system 90% cpu 41.401 total
found 845529
no more banch 845529
All done count 845529
        memory_header 2536695
        memcmp_count 114942650
        memory_body 1568
        restore_count 15219540
        restore_size 202927200
        range_count 21
        range_size 280
+leo+kono time ./tableau 6 > ers; tail ers
./tableau 6 > ers  5.04s user 0.32s system 97% cpu 5.514 total
found 159299
no more banch 159299
All done count 159299
        memory_header 477990
        memcmp_count 15198190
        memory_body 1344
        restore_count 2389500
        restore_size 31860000
        range_count 18
        range_size 240
+leo+kono time ./tableau 5 > ers; tail ers
./tableau 5 > ers  1.04s user 0.08s system 96% cpu 1.154 total
no more banch 38984
no more banch 38984
All done count 38984
        memory_header 117030
        memcmp_count 2432088
        memory_body 1120
        restore_count 467820
        restore_size 6237600
        range_count 15
        range_size 200

Lite ( tableau on SICStus Prolog ) では、

208.57 sec.
1365 states
60 subterms
21075 state transions
renaming,singleton,length limit 5

なので、結構、いい値かな。つうか、知っていはいたが、Lite 遅すぎ。
状態数が多いのは何故だろう? たぶん、code segment のtask のpointer
が細かすぎるのだろう...

Sun Sep 10 02:45:16 JST 2006

Iterator を使えば、tableau 自体もそんなに難しくないか。

Sat Sep  9 23:25:42 JST 2006

あ、そうか。
    memory の部分木が同じなら、それもshareした方が良い
でも、そのためには、pattern だけでなく、adr/left/right も
含んだ形で share を行わないとダメ。

まぁ、とりあえず、全部copyってことで...

copy_memory を、もっとintelligentにすればいいんだろうな...

Sat Sep  9 22:15:10 JST 2006

range を登録して、そのrangeに対して、state を決める。
それを look up するわけだけど、
    state, memory range for real address
    state, memory range in database (as copy)
と二つあることになる。

実際に、code segement を実行して、すべてのmemory rangeを
lookup するのは、実はばかげてる。code segment で memory に
書き込んだときに、どこを書き込んだのか dirty list みたいな
形で持っておくべきでしょうね。

単にデータを圧縮するだけでなく、そのあたりを工夫しないと
速度的に厳しい。

code segment の実行も、同じパターンの実行だったら、二度は
行わないみたいな工夫が必要だと思う。それは、一種の理論に
なるんだろうけど...

まぁ、とりあえずは、それはやらないけどさ。

memory range は、実際には増減することになる。malloc / free
した時にどうするかは、これからの課題だろう。

Sat Sep  9 19:16:10 JST 2006

memory_add は、いいんだけど、state DB のlookup で使う状態は、
どうやって作るんだろう?

間が開いているので、何やろうとしていたんだか、良くわからん。

memory_add は、状態に対して行うべきものなんじゃないの?

たぶん、memory_add に相当するものは、
    state に対する address range の登録
    memory pattern の検索と登録
の二種類があるんだと思われる。そのあたりを曖昧に作ってしまった
らしい。


Sun Aug  6 15:23:05 JST 2006

tree をbaranceさせないとだめなのは、そうなんだけど、
tree search routine も code segement で記述した方が
やっぱり良い。

main loop を書くのが面倒だが、あと、も少しなはずだが、
今日中に終る自信はないね。

Binary Tree そのものが状態データベースになるわけなので、
そこに安直なものを使うのはまずい。

Sat Aug  5 22:04:00 JST 2006

はぁ、だいぶ出来た。

    MemoryPtr
    add_memory(void *ptr,int length, MemoryPtr *parent)

で、登録していくわけね。

test routine を書いていかないと。

Sat Aug  5 19:35:56 JST 2006

typedef struct memory {
        void *adr;
        int  length;
        void *body;
        int  crc;
        struct memory *left,*right;
} Memory, *MemoryPtr;

body と address をわけて、中身が同じなら、同じものを
さすようにする。ということは、crc でhashしないとだめ。
crc じゃなくて hash か。

content hash で 2分木をつくって、さらに、adr/length pair
で2分木を作ればいいんじゃないか? そうすれば hash はいりません。
バランスはさせないとまずいけど。

Sat Aug  5 17:45:26 JST 2006

state と state_db にわけるのか。

typedef struct memory {
        void *ptr;
        int  length;
        struct memory *next;
} Memory, *MemoryPtr;

なんだが、binary tree にするべきかどうか。まぁ、するべきな
んだけど、そうすると、形がuniqueでなくなるのがまずい。正規
形にならないの? まぁ、正規形でなくても、maximum share され
ていれば、文句はないんだけど。 

大半のルーチンで、変更されるメモリはごく一部なはず。それを
効率的に捕まえるためには、compiler or program 変換で捕まえる
必要があるはず。(OSのサポートとか?)

同じ形のメリットは同一性の判定の問題だけ。連続した領域とか
の同一性はどうする? MD5? MD5 はだめだな。

address が違うだけで、中身が同じ場合は共有するべきだろ?
だとすれば、中身はハッシュするべきだろう。

queue とかの場合の対称性は、abstrct()で正規形に変換してから
db に登録すれば良いわけなんだが、そこまでは間に合わないらしい。
正規形の大半は、制御に影響しない(あるいはランダムに影響する)
データをzero clearすることになるはず。

まぁ、何か変だね。もう少し考えると、すっきりしたもの(ordered BDD
を含む)なにかが見つかるだろう。

   |------|    |------|

という領域ではなくて、

   |------xxxxxx------|

という don't care を含むメモリ領域の正規化という問題だってこと?

BDD は、
   |tfxxxxxfxtxxfffttt|
という文字列の正規化とみなせるわけだから... なんか、どっかで
見た問題だな。

Sat Jul 29 18:44:33 JST 2006

No compile errors.

まぁ、走らせるのは簡単なんだが、状態の登録をどうする?

malloc() した状態の登録をどうする?

*同じ* pointer というのを識別する必要がある。 id で識別する?

まぁ、最初は malloc しないでも良い。
    add_state(void *p,int length);
ぐらい。

同じ id (つまり、address )は、同じアドレスである必要があるが...
同じ大きさとは限らない。一番大きなものに合わせる?

malloc を許すと、そもそも、止まるアルゴリズムにならないが...

malloc() しても、中身の多様性を無視できる場合。
    add_state(void *p,int length, (*abstrct)(void *,int ));

メモリreferece は、id で抽象化する必要がある。ということは、
メモリ演算は、抽象化される必要がある。(移動をともなう場合)

まぁ、とりあえず固定でやるしかないか。

つまり、最初のtablue 展開ルーチンに来るまでに、
add_state は有限固定回起きるという話なわけね。
しかも順序が固定というわけか。

/* epoch */