# HG changeset patch # User Shinji KONO # Date 1249554711 -32400 # Node ID 6113af8f183b42f3b74a87e461a05b06e732067a # Parent 1a913ca7a4a81774c836e108935e24e3f9ff44a3 MemHash... diff -r 1a913ca7a4a8 -r 6113af8f183b TaskManager/ChangeLog --- a/TaskManager/ChangeLog Thu Aug 06 12:11:47 2009 +0900 +++ b/TaskManager/ChangeLog Thu Aug 06 19:31:51 2009 +0900 @@ -1,3 +1,11 @@ +2009-08-06 Shinji KONO + +うーん、get_segemnt で、dma_wait のtagをなんとかする +必要があるらしい。get_tag() でなんとかなるけど、 +他のtag との関係があるかな。 + +完全に見えなくするべきでしょうけど... 今はいい。 + 2009-08-01 Shinji KONO MemList は動いたので、今度は TileHash を TaskManager 側に移動する @@ -49,16 +57,18 @@ PPU からMainMemory にResource を Access する API 長さ別の freeList と単一の HashTable で管理する - set_rgb に相当。 - uint32 segment_id = smanager->get_segment(uint64 addr, uint64 size) + 読みだしAPI。set_rgb に相当。 + uint32 segment_id = smanager->get_segment(memaddr addr, *MemList m) id は hash値に相当。 - + addr で指定された PPU の Address が Hash にあるかどうか調べる。 + 無ければ dma_load する。そして指定された id を返す。 + + 書き出しAPI、読みだしていること前提。 smanager->put_segment(wait_id); - - - addr で指定された PPU の Address が Hash にあるかどうか調べる。無ければ dma_load する。そして指定された id を返す。 - void* smanager->wait_segment(uint32 segment_id) - id で指定された PPU の segment の copy の Address を返す。必要があれば dma_wait を行う。 + + MemorySegment* smanager->wait_segment(uint32 segment_id) + id で指定された PPU の segment の copy の Address を返す。 + 必要があれば dma_wait を行う。書き出しも待ち合わせる。 2009-06-8 Shinji KONO diff -r 1a913ca7a4a8 -r 6113af8f183b TaskManager/Test/test_render/Makefile.def --- a/TaskManager/Test/test_render/Makefile.def Thu Aug 06 12:11:47 2009 +0900 +++ b/TaskManager/Test/test_render/Makefile.def Thu Aug 06 19:31:51 2009 +0900 @@ -3,7 +3,7 @@ CERIUM = ../../.. CC = g++ -CFLAGS = -O9 -g -Wall -D USE_MEMLIST=1 # -DDEBUG +CFLAGS = -O9 -g -Wall -DUSE_MEMLIST=1 -DUSE_MEMHASH=1 # -DDEBUG INCLUDE = -I$(CERIUM)/include/TaskManager -I. -LIBS = -L$(CERIUM)/TaskManager \ No newline at end of file +LIBS = -L$(CERIUM)/TaskManager diff -r 1a913ca7a4a8 -r 6113af8f183b TaskManager/Test/test_render/task/DrawSpan.cpp --- a/TaskManager/Test/test_render/task/DrawSpan.cpp Thu Aug 06 12:11:47 2009 +0900 +++ b/TaskManager/Test/test_render/task/DrawSpan.cpp Thu Aug 06 19:31:51 2009 +0900 @@ -119,7 +119,7 @@ return buf; } - +#if !USE_MEMHASH /** * Span が使う Texture Tile があるか * @@ -159,6 +159,7 @@ return tile; } +#endif uint32 DrawSpan::get_rgb(int tx, int ty, TilePtr tile) @@ -308,6 +309,11 @@ tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; +#if USE_MEMHASH + TilePtr tile = smanager->get_segement(tex_addr, + sizeof(uint32)*TEXTURE_BLOCK_SIZE); + smanager->wait_segement(tileid); +#else TilePtr tile; if (!(tile = isAvailableTile(tex_addr))) { tile = set_rgb(tex_addr, wait_tag); @@ -319,6 +325,7 @@ tileList->moveToFirst(tile); } #endif +#endif updateBuffer(zpos, rangex, localx, localy, tex_localx, tex_localy, @@ -414,7 +421,11 @@ span->tex_width, (memaddr)span->tex_addr); tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; - +#if USE_MEMHASH + TilePtr tile = smanager->get_segement(tex_addr, + sizeof(uint32)*TEXTURE_BLOCK_SIZE); + smanager->wait_segement(tile); +#else TilePtr tile; if (!(tile = isAvailableTile(tex_addr))) { tile = set_rgb(tex_addr, wait_tag); @@ -425,6 +436,7 @@ tileList->moveToFirst(tile); } #endif +#endif updateBuffer(tex_z, rangex, localx, localy, tex_localx, tex_localy, @@ -494,8 +506,9 @@ // y の範囲 int rangey = smanager->get_param(4); - +#if !USE_MEMHASH hash = (TileHashPtr)smanager->global_get(GLOBAL_TEXTURE_HASH); +#endif tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST); zRow = zRow_init(rangex, rangey); @@ -575,3 +588,5 @@ free(free_spack); return 0; } + +/* end */ diff -r 1a913ca7a4a8 -r 6113af8f183b TaskManager/Test/test_render/task/DrawSpan.h --- a/TaskManager/Test/test_render/task/DrawSpan.h Thu Aug 06 12:11:47 2009 +0900 +++ b/TaskManager/Test/test_render/task/DrawSpan.h Thu Aug 06 19:31:51 2009 +0900 @@ -4,7 +4,9 @@ #include "SchedTask.h" #include "Tapestry.h" #include "SpanPack.h" +#if !USE_MEMHASH #include "TileHash.h" +#endif class DrawSpan : public SchedTask { public: @@ -12,7 +14,9 @@ int *linebuf; float *zRow; +#if !USE_MEMHASH TileHashPtr hash; +#endif TileListPtr tileList; int doneWrite; diff -r 1a913ca7a4a8 -r 6113af8f183b TaskManager/Test/test_render/task/Load_Texture.cpp --- a/TaskManager/Test/test_render/task/Load_Texture.cpp Thu Aug 06 12:11:47 2009 +0900 +++ b/TaskManager/Test/test_render/task/Load_Texture.cpp Thu Aug 06 19:31:51 2009 +0900 @@ -2,7 +2,9 @@ #include #include "Load_Texture.h" #include "texture.h" +#if !USE_MEMHASH #include "TileHash.h" +#endif #include "Func.h" #include "global_alloc.h" #include "Tapestry.h" @@ -16,6 +18,8 @@ int LoadTexture::run(void *rbuf , void *wbuf) { +#if USE_MEMHASH +#else /** * 現在 global_alloc() では new をサポートしてないので * コンストラクタ呼ぶために placement new してます。 @@ -23,6 +27,7 @@ void *hash_tmp = smanager->global_alloc(GLOBAL_TEXTURE_HASH, sizeof(TileHash)); new(hash_tmp) TileHash; +#endif #if USE_MEMLIST MemList *ml = smanager->createMemList(sizeof(uint32) * TEXTURE_BLOCK_SIZE, MAX_TILE); diff -r 1a913ca7a4a8 -r 6113af8f183b TaskManager/kernel/schedule/Scheduler.cc --- a/TaskManager/kernel/schedule/Scheduler.cc Thu Aug 06 12:11:47 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Thu Aug 06 19:31:51 2009 +0900 @@ -3,6 +3,7 @@ #include "Scheduler.h" #include "SchedNop.h" #include "error.h" +#include /* * Edit kernel/schedule/xx.cc, Cell/spe/xx.cc will be over writen by this. @@ -283,6 +284,10 @@ return group->status(); } +/* + ここから下は、memory 以下にあるべき + */ + void* Scheduler::global_alloc(int id, int size) { @@ -331,6 +336,9 @@ } /*! + + size 単位のMemory Segment を count 個作る + @param [size] リストの要素1つのサイズ @param [count] 要素数 @return allocate した領域のポインタ @@ -348,8 +356,86 @@ MemorySegment* next = (MemorySegment*)(mseg+seg_size*i); char* data = (char*)next+head_size; next->data = (void*)data; + next->size = size; mlist->addLast(next); } return mlist; } + +/*! + + Main Memory のSegmentを取得する + + @param [addr] Main Memory のアドレス + @param [m] Mem List + @return allocate した領域のポインタ + + memory directory にあるべきだが... + + */ +MemorySegement * +Scheduler::get_segment(memaddr addr, MemList *m) +{ + MemorySegment *s = hash->get(addr); + if (s) { + /* 既に load されている */ + return s; + } + + /* LRU なので、もっとも使われてない segment を上書きする */ + s = m->getLast(); + m->moveToFirst(s); + + memaddr old_addr = s->address; + s->tag = getTag(); + smanager->dma_load(s->data, addr, + s->size, s->tag); + /* 前のをhashから削除 */ + hash->remove(old_addr); + /* 新しいaddress を登録 */ + s->address = addr; + hash->put(s->address, s); + + return s; +} + +uint32 +Scheduler::get_tag() +{ + return 0; +} + +/*! + + Main Memory のSegmentを書き出す + Segment は get_segement されていて、 + 追い出されていてはいけない。 + それを保証するのは難しい? + + @param [addr] Main Memory のアドレス + @param [m] Mem List + @return allocate した領域のポインタ + + */ +void +Scheduler::put_segment(MemorySegment *s) +{ + smanager->dma_store(s->data, s->addr, + s->size, s->tag); +} + +/*! + + Main Memory のSegmentを読込、書き出しを待つ + + @param [id] MemorySegment のid + + */ +void +Scheduelr::wait_segment(MemorySegment *s) +{ + smanager->dma_wait(s->tag); +} + +/* end */