changeset 667:d753b4f6b129

SimpeTask WordCount Worked.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 03 Dec 2009 04:23:36 +0900
parents 4615489c5faa
children 6bec6efda444
files TaskManager/Makefile.def TaskManager/kernel/ppe/Task.cc example/word_count_test/Makefile.def example/word_count_test/main.cc example/word_count_test/ppe/Exec.cc example/word_count_test/ppe/Print.cc example/word_count_test/spe/Exec.cc example/word_count_test/spe/Makefile example/word_count_test/spe/Print.cc
diffstat 9 files changed, 163 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Makefile.def	Thu Dec 03 02:11:31 2009 +0900
+++ b/TaskManager/Makefile.def	Thu Dec 03 04:23:36 2009 +0900
@@ -29,8 +29,8 @@
 
 ABIBIT = 32
 
-# SIMPLE_TASK=-DSIMPLE_TASK
-SIMPLE_TASK=
+SIMPLE_TASK=-DSIMPLE_TASK
+# SIMPLE_TASK=
 
 OPT = -O9 -g
 # OPT =  -g
--- a/TaskManager/kernel/ppe/Task.cc	Thu Dec 03 02:11:31 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.cc	Thu Dec 03 04:23:36 2009 +0900
@@ -11,7 +11,11 @@
 int
 Task::add_inData_t(memaddr addr, int size)
 {
+#ifdef SIMPLE_TASK
+    return 0;
+#else
     return add_data(inData, addr, size);
+#endif
 }
 
 /**
@@ -25,7 +29,11 @@
 int
 Task::add_outData_t(memaddr addr, int size)
 {
+#ifdef SIMPLE_TASK
+    return 0;
+#else
     return add_data(outData, addr, size);
+#endif
 }
 
 /**
@@ -41,18 +49,22 @@
 int
 Task::add_param0(memaddr _param)
 {
+#ifndef SIMPLE_TASK
     if (param_size >= MAX_PARAMS) return -1;
     
     this->param[param_size++] = _param;
+#endif
     return 0;
 }
 
 int
 Task::set_param0(int index, memaddr _param)
 {
+#ifndef SIMPLE_TASK
     if (index >= MAX_PARAMS) return -1;
     
     this->param[index] = _param;
+#endif
     return 0;
 }
 
@@ -63,6 +75,7 @@
 int
 Task::add_data(ListData& list, memaddr addr, int size)
 {
+#ifndef SIMPLE_TASK
     if (list.length >= MAX_LIST_DMA_SIZE) return -1;
 
     list.bound[list.length] = list.size;
@@ -77,6 +90,7 @@
     elm->addr = addr;
 #endif
     elm->size = size;
+#endif
 
     return 0;
 }
--- a/example/word_count_test/Makefile.def	Thu Dec 03 02:11:31 2009 +0900
+++ b/example/word_count_test/Makefile.def	Thu Dec 03 04:23:36 2009 +0900
@@ -7,9 +7,12 @@
 # ex  linux/ps3
 CERIUM = ../../../Cerium
 
-OPT = -O9
+SIMPLE_TASK= -DSIMPLE_TASK
+
+OPT =  -O9
+# OPT =  -g
 CC      = g++
-CFLAGS  =  -Wall $(OPT)
+CFLAGS  =  -Wall $(OPT) $(SIMPLE_TASK)
 
 INCLUDE = -I${CERIUM}/include/TaskManager -I. -I..
 LIBS = -L${CERIUM}/TaskManager
--- a/example/word_count_test/main.cc	Thu Dec 03 02:11:31 2009 +0900
+++ b/example/word_count_test/main.cc	Thu Dec 03 04:23:36 2009 +0900
@@ -9,6 +9,7 @@
 #include "TaskManager.h"
 #include "SchedTask.h"
 #include "Func.h"
+#include "WordCount.h"
 
 extern void task_init();
 
@@ -19,20 +20,6 @@
     off_t size;
 } st_mmap_t;
 
-typedef struct {
-    int size;             // remaining file size
-    int division_size;    // for each word count task
-    int division_out_size;    
-    int task_num;         // remaining task count
-    int task_blocks;      // spawn task one at a time
-    int status_num; 
-    int task_spwaned;
-    unsigned long long *o_data;
-    unsigned long long *head_tail_flag;
-    int pad; 
-    caddr_t file_mmap;
-    HTaskPtr t_print;
-} WordCount;
 
 
 /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/
@@ -86,12 +73,19 @@
 {
     for (int j = 0; j < task_count && w->size>0; j++) {
 	int i = w->task_spwaned++;
+#ifdef SIMPLE_TASK
+	//    printf("div %0x\n", (w->file_mmap + i*w->division_size));
+	HTaskPtr t_exec = manager->create_task(TASK_EXEC,
+	    (memaddr)(w->file_mmap + i*w->division_size), size,
+	    (memaddr)(w->o_data + i*w->out_size), w->division_out_size);
+#else
 	HTaskPtr t_exec = manager->create_task(TASK_EXEC);
 	if (size>w->size) size = w->size;
 	t_exec->add_inData(w->file_mmap + i*w->division_size, size);
 	t_exec->add_outData(w->o_data + i*w->status_num, w->division_out_size);
 	t_exec->add_outData(w->head_tail_flag + i*w->pad, w->division_out_size);
 	t_exec->add_param(size);
+#endif
 	t_exec->set_cpu(SPE_ANY);
 	t_next->wait_for(t_exec);
 	t_exec->spawn();
@@ -105,7 +99,11 @@
 static int
 run16(SchedTask *manager, void *in, void *out)
 {
+#ifdef SIMPLE_TASK
+    WordCount *w = *(WordCount **)in;
+#else
     WordCount *w = (WordCount *)manager->get_param(0);
+#endif
    
     if (w->task_num < w->task_blocks) {
 	if (w->size >= w->division_size) 
@@ -114,9 +112,13 @@
 	    run_tasks(manager,w,1, w->t_print, w->size);
 	// printf("run16 last %d\n",w->task_num);
     } else {
-
+#ifdef SIMPLE_TASK
+	HTaskPtr t_next = manager->create_task(RUN_TASK_BLOCKS,
+	    (memaddr)&w->self,sizeof(memaddr),0,0);
+#else
 	HTaskPtr t_next = manager->create_task(RUN_TASK_BLOCKS);
 	t_next->set_param(0,(void*)w);
+#endif
 	w->t_print->wait_for(t_next);
 
 	run_tasks(manager,w, w->task_blocks, t_next, w->division_size);
@@ -128,7 +130,7 @@
 }
 
 
-static int blocks = 192;
+static int blocks = 48;
 static int division = 16; // in Kbyte
 
 static void
@@ -141,6 +143,7 @@
     WordCount *w = (WordCount*)manager->allocate(sizeof(WordCount));
     // bzero(w,sizeof(WordCount));
 
+    w->self = w;
     w->task_blocks = blocks;
     w->task_spwaned = 0;
 
@@ -163,23 +166,36 @@
     w-> task_num = w->size / w->division_size;
     int out_task_num = w->task_num + (w->division_size*w->task_num < w->size);
 
+    w->out_task_num = out_task_num;
     printf("task_num %d\n",w->task_num);
 
     /* out用のdivision_size. statusが2つなので、あわせて16byteになるように、long long(8byte)を使用 */
+
+#ifdef SIMPLE_TASK
+    w-> division_out_size = sizeof(unsigned long long)*4;
+    int out_size = w->division_out_size*out_task_num;
+    w->o_data = (unsigned long long *)manager->allocate(out_size);
+    w-> out_size = 4;
+#else
     w-> division_out_size = 16;
+    int out_size = w->division_out_size*out_task_num;
     /* out用のデータのサイズ。*/
-    int out_size = w->division_out_size*out_task_num;
-    w->o_data = (unsigned long long*)manager->allocate(out_size);
+    caddr_t p = manager->allocate(out_size*2);
+    w->o_data = (unsigned long long*)p
     //bzero(w->o_data,out_size);
 
     w-> pad = 2;
-    w->head_tail_flag = (unsigned long long*)manager->allocate(out_size);
+    w->head_tail_flag = (unsigned long long*)(p+out_size);
     // bzero(w->head_tail_flag,out_size);
-
+#endif
     printf("out size %d\n",out_size);
 
     /*各SPEの結果を合計して出力するタスク*/
 
+#ifdef SIMPLE_TASK
+    t_print = manager->create_task(TASK_PRINT,
+	(memaddr)&w->self,sizeof(memaddr),0,0);
+#else
     t_print = manager->create_task(TASK_PRINT);
     t_print->add_inData(w->o_data, out_size);
     t_print->add_inData(w->head_tail_flag, out_size);
@@ -187,13 +203,18 @@
     t_print->add_param(w->status_num);
     t_print->add_param(out_task_num);
     t_print->add_param(w->pad);
+#endif
 
     w->t_print = t_print;
 
     /* Task を task_blocks ずつ起動する Task */
-
+#ifdef SIMPLE_TASK
+    HTaskPtr t_exec = manager->create_task(RUN_TASK_BLOCKS,
+	(memaddr)&w->self,sizeof(memaddr),0,0);
+#else
     HTaskPtr t_exec = manager->create_task(RUN_TASK_BLOCKS);
     t_exec->set_param(0,(void*)w);
+#endif
     t_exec->spawn();
 
     t_print->wait_for(t_exec);
--- a/example/word_count_test/ppe/Exec.cc	Thu Dec 03 02:11:31 2009 +0900
+++ b/example/word_count_test/ppe/Exec.cc	Thu Dec 03 04:23:36 2009 +0900
@@ -9,11 +9,18 @@
 static int
 run(SchedTask *s, void *rbuf, void *wbuf)
 {
+#ifdef SIMPLE_TASK
+    char *i_data = (char *)rbuf;
+    unsigned long long *o_data = (unsigned long long*)wbuf;
+    unsigned long long *head_tail_flag = o_data +2;
+    int length = s->read_size();
+#else
     char *i_data = (char*)s->get_input(rbuf, 0);
     unsigned long long *o_data = (unsigned long long*)s->get_output(wbuf, 0);
     /*担当範囲の先頭、末尾が「改行、スペース」か、「それ以外の文字」かのフラグ*/
     unsigned long long  *head_tail_flag = (unsigned long long*)s->get_output(wbuf,1);
     int length = (long)s->get_param(0);
+#endif
     int word_flag = 0;
     int word_num = 0;
     int line_num = 0;
@@ -21,7 +28,7 @@
     
     /*文字なら1,スペースか改行なら0*/
     head_tail_flag[0] = (i_data[0] != 0x20) && (i_data[0] != 0x0A);
-    word_num -= 1- head_tail_flag[0];
+    word_num -= 1-head_tail_flag[0];
 
     for (; i < length; i++) {
 
--- a/example/word_count_test/ppe/Print.cc	Thu Dec 03 02:11:31 2009 +0900
+++ b/example/word_count_test/ppe/Print.cc	Thu Dec 03 04:23:36 2009 +0900
@@ -2,20 +2,36 @@
 #include <string.h>
 #include "Print.h"
 #include "Func.h"
+#include "WordCount.h"
 
 /* これは必須 */
-SchedDefineTask(Print);
+SchedDefineTask1(Print,run_print);
 
 static int
-run(SchedTask *s, void *rbuf, void *wbuf)
+run_print(SchedTask *s, void *rbuf, void *wbuf)
 {
+#ifdef SIMPLE_TASK
+    WordCount *w = *(WordCount**)rbuf;
+    unsigned long long *idata = w->o_data;
+    // long task_num = w->task_num;
+    long status_num = w->status_num;
+    int out_task_num = w->out_task_num;
+
+    /*
+     *  head_flag
+     *  o_data[0]
+     *  o_data[1]
+     *
+     */
+#else
+    int pad = w->pad;
     unsigned long long *idata = (unsigned long long*)s->get_input(rbuf, 0);
-    unsigned long long *head_tail_flag= (unsigned long long*)s->get_input(rbuf,1);
     long task_num = (long)s->get_param(0);
     long status_num = (long)s->get_param(1);
-    int out_task_num = (int)s->get_param(2);
+    // int out_task_num = (int)s->get_param(2);
     int pad = (int)s->get_param(3);
-    unsigned long long word_data[task_num];
+#endif
+    unsigned long long word_data[2];
 
     int flag_cal_sum = 0;
     //printf("pad %d\n",pad);
@@ -53,32 +69,42 @@
      *
      */
 
-
-    for (int i = 1; i < out_task_num * pad - pad; i += pad) {
-      //printf("%llu ",head_tail_flag[i]);
-      //printf("%llu\n",head_tail_flag[i+1]);
-
-      if((head_tail_flag[i] == 1) && (head_tail_flag[i+1] == 0)) {
-	flag_cal_sum++;
-      }
-
-    }
-
     s->printf("start sum\n");
 
     for (int i = 0; i < status_num; i++) {
 	word_data[i] = 0;
     }
 
-    for (int i = 0; i < task_num*status_num; i += status_num) {
+#ifdef SIMPLE_TASK
+    for (int i = 0; i < out_task_num ; i++) {
+	word_data[0] += idata[i*w->out_size+0];
+	word_data[1] += idata[i*w->out_size+1];
+	unsigned long long *head_tail_flag = 
+		       &idata[i*w->out_size+2];
+        if((i!=out_task_num-1)&&
+           (head_tail_flag[1] == 1) && (head_tail_flag[4] == 0)) {
+	    flag_cal_sum++;
+        }
+    }
+#else
+    for (int i = 1; i < out_task_num * pad - pad; i += pad) {
+      //printf("%llu ",head_tail_flag[i]);
+      //printf("%llu\n",head_tail_flag[i+1]);
+      if((head_tail_flag[i] == 1) && (head_tail_flag[i+1] == 0)) {
+	flag_cal_sum++;
+      }
+    }
+
+    for (int i = 0; i < out_task_num*status_num; i += status_num) {
 	for (int j = 0; j < status_num; j++) {
 	    word_data[j] += idata[i+j];
 	}
     }
+#endif
 
     word_data[0] += flag_cal_sum;
 
-    for (int i = status_num-1; i >= 0; i--) {
+    for (int i = status_num-1; i >=0; i--) {
 	s->printf("%llu ",word_data[i]);
     }
 
--- a/example/word_count_test/spe/Exec.cc	Thu Dec 03 02:11:31 2009 +0900
+++ b/example/word_count_test/spe/Exec.cc	Thu Dec 03 04:23:36 2009 +0900
@@ -9,11 +9,18 @@
 static int
 run(SchedTask *s, void *rbuf, void *wbuf)
 {
+#ifdef SIMPLE_TASK
+    char *i_data = (char *)rbuf;
+    unsigned long long *o_data = (unsigned long long*)wbuf;
+    unsigned long long *head_tail_flag = o_data +2;
+    int length = s->read_size();
+#else
     char *i_data = (char*)s->get_input(rbuf, 0);
     unsigned long long *o_data = (unsigned long long*)s->get_output(wbuf, 0);
     /*担当範囲の先頭、末尾が「改行、スペース」か、「それ以外の文字」かのフラグ*/
     unsigned long long  *head_tail_flag = (unsigned long long*)s->get_output(wbuf,1);
     int length = (long)s->get_param(0);
+#endif
     int word_flag = 0;
     int word_num = 0;
     int line_num = 0;
@@ -51,7 +58,7 @@
     //printf("last word %c",i_data[i-1]);
     head_tail_flag[1] = (i_data[i-1] != 0x20) && (i_data[i-1] != 0x0A);
 
-    // s->printf("PPE word %d line %d\n",word_num,line_num);
+    // s->printf("SPE word %d line %d\n",word_num,line_num);
 
     o_data[0] = (unsigned long long)word_num;
     o_data[1] = (unsigned long long)line_num;
--- a/example/word_count_test/spe/Makefile	Thu Dec 03 02:11:31 2009 +0900
+++ b/example/word_count_test/spe/Makefile	Thu Dec 03 04:23:36 2009 +0900
@@ -7,7 +7,7 @@
 OBJS = $(SRCS:.cc=.o)
 
 CC      = spu-g++
-CFLAGS  = -Wall -fno-exceptions -fno-rtti $(OPT) #-DDEBUG
+CFLAGS  = -Wall -fno-exceptions -fno-rtti $(OPT) $(SIMPLE_TASK) #-DDEBUG
 INCLUDE = -I../${CERIUM}/include/TaskManager -I. -I..
 LIBS = -L../${CERIUM}/TaskManager -lspemanager
 
--- a/example/word_count_test/spe/Print.cc	Thu Dec 03 02:11:31 2009 +0900
+++ b/example/word_count_test/spe/Print.cc	Thu Dec 03 04:23:36 2009 +0900
@@ -2,6 +2,7 @@
 #include <string.h>
 #include "Print.h"
 #include "Func.h"
+#include "WordCount.h"
 
 /* これは必須 */
 SchedDefineTask(Print);
@@ -9,13 +10,28 @@
 static int
 run(SchedTask *s, void *rbuf, void *wbuf)
 {
+#ifdef SIMPLE_TASK
+    WordCount *w = *(WordCount**)rbuf;
+    unsigned long long *idata = w->o_data;
+    long task_num = w->task_num;
+    long status_num = w->status_num;
+    int out_task_num = w->out_task_num;
+
+    /*
+     *  head_flag
+     *  o_data[0]
+     *  o_data[1]
+     *
+     */
+#else
+    int pad = w->pad;
     unsigned long long *idata = (unsigned long long*)s->get_input(rbuf, 0);
-    unsigned long long *head_tail_flag= (unsigned long long*)s->get_input(rbuf,1);
     long task_num = (long)s->get_param(0);
     long status_num = (long)s->get_param(1);
     int out_task_num = (int)s->get_param(2);
     int pad = (int)s->get_param(3);
-    unsigned long long word_data[task_num];
+#endif
+    unsigned long long word_data[task_num]; // まぁ、gcc では通るんだけど..
 
     int flag_cal_sum = 0;
     //printf("pad %d\n",pad);
@@ -53,32 +69,41 @@
      *
      */
 
-
-    for (int i = 1; i < out_task_num * pad - pad; i += pad) {
-      //printf("%llu ",head_tail_flag[i]);
-      //printf("%llu\n",head_tail_flag[i+1]);
-
-      if((head_tail_flag[i] == 1) && (head_tail_flag[i+1] == 0)) {
-	flag_cal_sum++;
-      }
-
-    }
-
     s->printf("start sum\n");
 
     for (int i = 0; i < status_num; i++) {
 	word_data[i] = 0;
     }
 
+#ifdef SIMPLE_TASK
+    for (int i = 0; i < out_task_num ; i++) {
+	word_data[0] += idata[i*w->out_size+0];
+	word_data[1] += idata[i*w->out_size+1];
+	unsigned long long *head_tail_flag = 
+		       &idata[i*w->out_size+2];
+      if((head_tail_flag[1] == 1) && (head_tail_flag[4] == 0)) {
+	flag_cal_sum++;
+      }
+    }
+#else
+    for (int i = 1; i < out_task_num * pad - pad; i += pad) {
+      //printf("%llu ",head_tail_flag[i]);
+      //printf("%llu\n",head_tail_flag[i+1]);
+      if((head_tail_flag[i] == 1) && (head_tail_flag[i+1] == 0)) {
+	flag_cal_sum++;
+      }
+    }
+
     for (int i = 0; i < task_num*status_num; i += status_num) {
 	for (int j = 0; j < status_num; j++) {
 	    word_data[j] += idata[i+j];
 	}
     }
+#endif
 
     word_data[0] += flag_cal_sum;
 
-    for (int i = 0; i < status_num; i++) {
+    for (int i = status_num-1; i >=0; i--) {
 	s->printf("%llu ",word_data[i]);
     }