changeset 386:6113af8f183b

MemHash...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 06 Aug 2009 19:31:51 +0900
parents 1a913ca7a4a8
children 5e2d30bfbf23
files TaskManager/ChangeLog TaskManager/Test/test_render/Makefile.def TaskManager/Test/test_render/task/DrawSpan.cpp TaskManager/Test/test_render/task/DrawSpan.h TaskManager/Test/test_render/task/Load_Texture.cpp TaskManager/kernel/schedule/Scheduler.cc
diffstat 6 files changed, 133 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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 <kono@ie.u-ryukyu.ac.jp>
+
+うーん、get_segemnt で、dma_wait のtagをなんとかする
+必要があるらしい。get_tag() でなんとかなるけど、
+他のtag との関係があるかな。
+
+完全に見えなくするべきでしょうけど... 今はいい。
+
 2009-08-01 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
 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  <kono@ie.u-ryukyu.ac.jp>
 
--- 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
--- 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 */
--- 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;
 
--- 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 <string.h>
 #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);
--- 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 <assert.h>
 
 /*
  * 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 */