changeset 949:86aea6affe6c

word count size fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 02 Aug 2010 15:05:02 +0900
parents 6a8941ee8294
children e0908a8955cd
files TaskManager/Makefile.def TaskManager/kernel/ppe/HTask.h TaskManager/kernel/ppe/Task.h TaskManager/kernel/ppe/TaskManagerImpl.cc example/word_count/WordCount.h example/word_count/main.cc
diffstat 6 files changed, 53 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Makefile.def	Mon Aug 02 09:36:02 2010 +0900
+++ b/TaskManager/Makefile.def	Mon Aug 02 15:05:02 2010 +0900
@@ -29,7 +29,7 @@
 
 ABIBIT = 32
 
-OPT = -g -O9
+OPT = -g -O9 -DEARLY_TOUCH
 # OPT =  -g -DTASK_LIST_MAIL -O9
 
 CC     = g++   
--- a/TaskManager/kernel/ppe/HTask.h	Mon Aug 02 09:36:02 2010 +0900
+++ b/TaskManager/kernel/ppe/HTask.h	Mon Aug 02 15:05:02 2010 +0900
@@ -71,18 +71,26 @@
 	t->set_outData_t(out_index++, addr,size);
     }
     void set_inData_t(int index, memaddr addr, int size) {
-      if ((unsigned long)addr&0xf) {
+#ifdef EARLY_TOUCH
+        if ((unsigned long)addr&0xf) {
 	  printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n", 
 		 command, index, (unsigned long)addr, size);
 	}
+        char *p = (char *)addr; char b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
 	Task *t = (Task*)rbuf;
 	t->set_inData_t(index, addr,size);
     }
     void set_outData_t(int index, memaddr addr, int size) { 
-      if ((unsigned long)addr&0xf) {
+#ifdef EARLY_TOUCH
+	if ((unsigned long)addr&0xf) {
 	  printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n", 
 		 command, index, (unsigned long)addr, size);
 	}
+        char *p = (char *)addr; char b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
 	Task *t = (Task*)rbuf;
 	t->set_outData_t(index, addr,size);
     }
--- a/TaskManager/kernel/ppe/Task.h	Mon Aug 02 09:36:02 2010 +0900
+++ b/TaskManager/kernel/ppe/Task.h	Mon Aug 02 15:05:02 2010 +0900
@@ -82,6 +82,14 @@
 
     void set_inData_t( int index, memaddr addr, int size) {
 	ListElement *list = inData(index);
+#ifdef EARLY_TOUCH
+        if ((unsigned long)addr&0xf) {
+          printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
+                 command, index, (unsigned long)addr, size);
+        }
+        char *p = (char *)addr; int b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
 #ifdef __CERIUM_CELL__
 	list->addr = (uint32)addr;
 #else
@@ -92,6 +100,14 @@
 
     void set_outData_t(int index, memaddr addr, int size) {
 	ListElement *list = outData(index);
+#ifdef EARLY_TOUCH
+        if ((unsigned long)addr&0xf) {
+          printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
+                 command, index, (unsigned long)addr, size);
+        }
+        char *p = (char *)addr; int b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
 #ifdef __CERIUM_CELL__
 	list->addr = (uint32)addr;
 #else
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Mon Aug 02 09:36:02 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Mon Aug 02 15:05:02 2010 +0900
@@ -59,6 +59,24 @@
     new_task->post_func = noaction;
     new_task->mimpl = this;
     new_task->from = (memaddr)from;
+#ifdef EARLY_TOUCH
+        if (rbuf) {
+	    if ((unsigned long)rbuf&0xf) {
+	      printf("Data is not aligned. command = %d, addr = 0x%lx, size = %ld\n",
+		     cmd, (unsigned long)rbuf, r_size);
+	    }
+	    char *p = (char *)rbuf; char b = *p;
+	    p = (char *)(rbuf+r_size-1); b += *p;
+        }
+        if (wbuf) {
+	    if ((unsigned long)wbuf&0xf) {
+	      printf("Data is not aligned. command = %d, addr = 0x%lx, size = %ld\n",
+		     cmd, (unsigned long)wbuf, w_size);
+	    }
+	    char *p = (char *)wbuf; char b = *p;
+	    p = (char *)(wbuf+w_size-1); b += *p;
+        }
+#endif
 
     return new_task;
 }
--- a/example/word_count/WordCount.h	Mon Aug 02 09:36:02 2010 +0900
+++ b/example/word_count/WordCount.h	Mon Aug 02 15:05:02 2010 +0900
@@ -14,6 +14,7 @@
     int out_task_num;
     int pad; 
     char * file_mmap;
+    int file_size;
     HTaskPtr t_print;
 } WordCount;
 
--- a/example/word_count/main.cc	Mon Aug 02 09:36:02 2010 +0900
+++ b/example/word_count/main.cc	Mon Aug 02 15:05:02 2010 +0900
@@ -94,6 +94,8 @@
     HTask *h_exec = 0;
     for (int j = 0; j < array_task_num; j++) {
 	int i = w->task_spwaned++;
+	if (w->size < size) size = w->size;
+	if (size==0) break;
 	if (use_task_array) {
 	    t_exec = task_array->next_task_array(TASK_EXEC,t_exec);
 	    t_exec->set_inData(0,w->file_mmap + i*w->division_size, size);
@@ -137,12 +139,14 @@
     WordCount *w = *(WordCount **)in;
    
     if (w->task_num < w->task_blocks) {
+	// last case
 	if (w->size >= w->division_size) 
 	    run_tasks(manager,w,w->task_num, w->t_print, w->division_size);
+	// remaining data 
 	while (w->size>0) 
 	    run_tasks(manager,w,1, w->t_print, w->size);
 	// printf("run16 last %d\n",w->task_num);
-    } else if (w->task_num > 0 ) {
+    } else {
 	HTaskPtr t_next = manager->create_task(RUN_TASK_BLOCKS,
 	    (memaddr)&w->self,sizeof(memaddr),0,0);
 	w->t_print->wait_for(t_next);
@@ -174,8 +178,9 @@
     w->task_spwaned = 0;
 
     /*sizeはdivision_sizeの倍数にしている。*/
-    w->size = st_mmap.size;
+    w->size = w->file_size = st_mmap.size;
     w->file_mmap = st_mmap.file_mmap;
+    printf("w %lx\n",(long)w);
 
     /* 1task分のデータサイズ(byte) */
     if (w->size >= 1024*division) {