# HG changeset patch # User Shinji KONO # Date 1280729102 -32400 # Node ID 86aea6affe6cd6fa35abd1de9f1d4d950831e911 # Parent 6a8941ee82943f043c42976b0b488dc0804b6097 word count size fix diff -r 6a8941ee8294 -r 86aea6affe6c TaskManager/Makefile.def --- 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++ diff -r 6a8941ee8294 -r 86aea6affe6c TaskManager/kernel/ppe/HTask.h --- 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); } diff -r 6a8941ee8294 -r 86aea6affe6c TaskManager/kernel/ppe/Task.h --- 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 diff -r 6a8941ee8294 -r 86aea6affe6c TaskManager/kernel/ppe/TaskManagerImpl.cc --- 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; } diff -r 6a8941ee8294 -r 86aea6affe6c example/word_count/WordCount.h --- 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; diff -r 6a8941ee8294 -r 86aea6affe6c example/word_count/main.cc --- 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) {