# HG changeset patch # User kkb # Date 1380883449 -32400 # Node ID 7673e2ad262358de7a5d47f60e31d829bb634be7 # Parent ef1099c41449bc247453a7a92cf2ebbc6cce495b fix profile diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/Fifo/FifoDmaManager.cc --- a/TaskManager/Fifo/FifoDmaManager.cc Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/Fifo/FifoDmaManager.cc Fri Oct 04 19:44:09 2013 +0900 @@ -13,12 +13,12 @@ if (size == 0) return buf; unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); buf = s->manager->allocate(size); memcpy(buf, (void*)addr, size); - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_load_time += wait; dma_load_time += wait; @@ -31,11 +31,11 @@ if (size == 0) return buf; unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); memcpy(buf, (void*)addr, size); - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_load_time += wait; dma_load_time += wait; return buf; @@ -55,11 +55,11 @@ if (size == 0) return buf; unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); memcpy((void*)addr, buf, size); - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_store_time += wait; dma_store_time += wait; @@ -79,7 +79,7 @@ FifoDmaManager::dma_loadList(Scheduler *s, ListDataPtr list, uint32 mask) { unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); int list_size = list->length; long bound; @@ -93,7 +93,7 @@ bound += elm->size; } - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_load_time += wait; dma_loadList_time += wait; @@ -104,7 +104,7 @@ FifoDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) { unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); int list_size = list->length; memaddr bound; @@ -117,7 +117,7 @@ bound += elm->size; } - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_store_time += wait; dma_storeList_time += wait; } @@ -126,11 +126,11 @@ FifoDmaManager::mail_write(memaddr data) { unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); mail_queue1->send(data); - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_mail_time += wait; mail_write_time += wait; } @@ -139,11 +139,11 @@ FifoDmaManager::mail_write_finish_list(memaddr data) { unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); mail_queue1->send(data); - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_mail_time += wait; mail_write_time += wait; } @@ -152,12 +152,12 @@ FifoDmaManager::mail_read() { unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); memaddr data; data = mail_queue2->recv(); - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_mail_time += wait; mail_read_time += wait; @@ -168,12 +168,12 @@ FifoDmaManager::task_list_mail_read() { unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); memaddr data; data = mail_queue2->recv(); - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_mail_time += wait; mail_read_time += wait; @@ -184,11 +184,11 @@ FifoDmaManager::mail_write_from_host(memaddr data) { unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); mail_queue2->send(data); - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_mail_time += wait; mail_write_from_host_time += wait; } @@ -197,12 +197,12 @@ FifoDmaManager::mail_read_from_host() { unsigned long long wait = 0; - (this->*start_dmawait_profile)(); + (*this->start_dmawait_profile)(); memaddr data; data = mail_queue1->recv(); - (this->*end_dmawait_profile)(&wait); + (*this->end_dmawait_profile)(&wait); global_mail_time += wait; mail_read_from_host_time += wait; @@ -215,9 +215,27 @@ return mail_queue1->count(); } +static unsigned long long start_time,stop_time; +void +do_start_dmawait_profile() +{ + start_time = gettime(); +} + +void +do_end_dmawait_profile(unsigned long long *counter) +{ + stop_time = gettime(); + *counter += stop_time - start_time; +} + +void null_start_dmawait_profile() {} +void null_end_dmawait_profile(unsigned long long *counter) {} + void FifoDmaManager::start_profile() { + global_start_time = gettime(); global_busy_time = 0; global_load_time = 0; global_store_time = 0; @@ -231,8 +249,8 @@ mail_read_from_host_time = 0; mail_write_from_host_time = 0; - start_dmawait_profile = &FifoDmaManager::do_start_dmawait_profile; - end_dmawait_profile = &FifoDmaManager::do_end_dmawait_profile; + start_dmawait_profile = &do_start_dmawait_profile; + end_dmawait_profile = &do_end_dmawait_profile; stop_time = gettime(); } @@ -240,35 +258,14 @@ void FifoDmaManager::stop_profile() { - start_time = gettime(); - global_busy_time += start_time - stop_time; - - start_dmawait_profile = &FifoDmaManager::null_start_dmawait_profile; - end_dmawait_profile = &FifoDmaManager::null_end_dmawait_profile; + start_dmawait_profile = &null_start_dmawait_profile; + end_dmawait_profile = &null_end_dmawait_profile; } void -FifoDmaManager::do_start_dmawait_profile() -{ - start_time = gettime(); - global_busy_time += start_time - stop_time; -} - -void -FifoDmaManager::do_end_dmawait_profile(unsigned long long *counter) -{ - stop_time = gettime(); - *counter += stop_time - start_time; -} - -void FifoDmaManager::null_start_dmawait_profile() {} -void FifoDmaManager::null_end_dmawait_profile(unsigned long long *counter) {} - -void FifoDmaManager::show_dma_wait(Scheduler *s, int cpu) { - unsigned long long all_time = global_busy_time + global_load_time + - global_store_time + global_mail_time; + unsigned long long all_time = gettime() - global_start_time; double busy = ((double)global_busy_time)/((double)all_time)*100.0; double load = ((double)global_load_time)/((double)all_time)*100.0; diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/Fifo/FifoDmaManager.h --- a/TaskManager/Fifo/FifoDmaManager.h Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/Fifo/FifoDmaManager.h Fri Oct 04 19:44:09 2013 +0900 @@ -10,8 +10,14 @@ #include "MailManager.h" #endif +void do_start_dmawait_profile(); +void do_end_dmawait_profile(unsigned long long *counter); +void null_start_dmawait_profile(); +void null_end_dmawait_profile(unsigned long long *counter); + class FifoDmaManager : public DmaManager { + protected: /* variables */ MailManagerPtr mail_queue1; @@ -28,8 +34,8 @@ mail_queue1 = new MailManager(); mail_queue2 = new MailManager(); #endif - start_dmawait_profile = &FifoDmaManager::null_start_dmawait_profile; - end_dmawait_profile = &FifoDmaManager::null_end_dmawait_profile; + start_dmawait_profile = &null_start_dmawait_profile; + end_dmawait_profile = &null_end_dmawait_profile; } ~FifoDmaManager() { @@ -39,8 +45,8 @@ /* variables */ protected: - unsigned long long start_time, stop_time; - unsigned long long global_busy_time, global_load_time, global_store_time, global_mail_time; + unsigned long long global_start_time; + unsigned long long global_load_time, global_store_time, global_mail_time; unsigned long long dma_load_time, dma_store_time, dma_loadList_time, dma_storeList_time; unsigned long long mail_read_time, mail_write_time; unsigned long long mail_read_from_host_time, mail_write_from_host_time; @@ -52,8 +58,8 @@ virtual void *dma_store(void *buf, memaddr addr, uint32 size, uint32 mask); virtual void dma_wait(uint32 mask) ; virtual void *get_writebuf(Scheduler *s, memaddr addr, uint32 size) ; - void (FifoDmaManager::*start_dmawait_profile)(); - void (FifoDmaManager::*end_dmawait_profile)(unsigned long long *counter); + // void (FifoDmaManager::*start_dmawait_profile)(); + // void (FifoDmaManager::*end_dmawait_profile)(unsigned long long *counter); void start_profile(); void stop_profile(); @@ -74,11 +80,6 @@ uint32 get_tag(); virtual void bound(ListData *); -private: - void do_start_dmawait_profile(); - void do_end_dmawait_profile(unsigned long long *counter); - void null_start_dmawait_profile(); - void null_end_dmawait_profile(unsigned long long *counter); }; diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/Fifo/PreRefDmaManager.cc --- a/TaskManager/Fifo/PreRefDmaManager.cc Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/Fifo/PreRefDmaManager.cc Fri Oct 04 19:44:09 2013 +0900 @@ -5,16 +5,11 @@ void * PreRefDmaManager::dma_load(Scheduler *s, memaddr addr, uint32 size, uint32 mask) { - unsigned long long wait = 0; - (this->*start_dmawait_profile)(); #ifdef __CERIUM_FIFO__ asm("prefetcht0 %0"::"m"(addr):"memory"); #endif // __CERIUM_FIFO__ - (this->*end_dmawait_profile)(&wait); - global_load_time += wait; - dma_load_time += wait; return (void*)addr; } diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/Fifo/gettime.h --- a/TaskManager/Fifo/gettime.h Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/Fifo/gettime.h Fri Oct 04 19:44:09 2013 +0900 @@ -3,27 +3,23 @@ #include #ifdef __APPLE__ -#include +#include "rdtsc.h" #endif -/** - * Mac OS X側には、clock_gettimeがないので、gettimeofdayを使う - */ + inline unsigned long long gettime() { unsigned long long time = 0; #ifdef __CERIUM_FIFO__ // ?? - struct timespec ts; #ifndef __APPLE__ + struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); + time = ((ts.tv_sec << 32) | ts.tv_nsec ); #else - struct timeval tv; - gettimeofday(&tv, NULL); - ts.tv_sec = tv.tv_sec; - ts.tv_nsec = tv.tv_usec * 1000; + time = rdtsc(); #endif - time = ((ts.tv_sec << 32) | ts.tv_nsec ); + #endif // __CERIUM_FIFO__ return time; diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/Fifo/rdtsc.h --- a/TaskManager/Fifo/rdtsc.h Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/Fifo/rdtsc.h Fri Oct 04 19:44:09 2013 +0900 @@ -5,12 +5,18 @@ * rdtsc is Read Time Stamp Counter */ -inline unsigned long long rdtsc() { - unsigned long long ret = 0; -#ifdef __CERIUM_FIFO__ // ?? - __asm__ volatile ("rdtsc" : "=A" (ret)); -#endif // __CERIUM_FIFO__ - return ret; +/* define this somewhere */ +#ifdef __i386 +__inline__ uint64_t rdtsc() { + uint64_t x; + __asm__ volatile ("rdtsc" : "=A" (x)); + return x; } - -#endif /* RDTSC_H_ */ +#elif __amd64 +__inline__ uint64_t rdtsc() { + uint64_t a, d; + __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); + return (d<<32) | a; +} +#endif +#endif diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/kernel/schedule/DmaManager.h --- a/TaskManager/kernel/schedule/DmaManager.h Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/kernel/schedule/DmaManager.h Fri Oct 04 19:44:09 2013 +0900 @@ -31,7 +31,9 @@ virtual void dma_wait(uint32 mask) {} virtual void show_dma_wait(Scheduler *s, int cpu) {} virtual void start_profile() {} - + void (*start_dmawait_profile)(); + void (*end_dmawait_profile)(unsigned long long* global_busy_time); + unsigned long long global_busy_time; // API for SPU inbound/outbound mailbox virtual void mail_write(memaddr data) {} virtual void mail_write_finish_list(memaddr data) {} diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Fri Oct 04 19:44:09 2013 +0900 @@ -114,11 +114,13 @@ connector->dma_wait((DMA_READ + this->tag)); void *read = get_input(readbuf, 0); void *write = get_output(writebuf, 0); // set param (if exist dim ) + (*connector->start_dmawait_profile)(); if (list->dim) { multi_dimension(list, read, write,run); } else { run(this, read,write); } + (*connector->end_dmawait_profile)(&connector->global_busy_time); connector->free_(readbuf); // User 側で作る方法が必要... // 書き込む領域がなければ無視 diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/test/UtilizationTest/Func.h --- a/TaskManager/test/UtilizationTest/Func.h Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/test/UtilizationTest/Func.h Fri Oct 04 19:44:09 2013 +0900 @@ -1,6 +1,7 @@ enum { #include "SysTasks.h" MULTIPLY_TASK, + MULTIPLY_TASK1, }; #define DATA_NUM 10000000 diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/test/UtilizationTest/main.cc --- a/TaskManager/test/UtilizationTest/main.cc Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/test/UtilizationTest/main.cc Fri Oct 04 19:44:09 2013 +0900 @@ -73,12 +73,13 @@ B[i]=(float)(i+1)/10.f; } - HTask *multiply = manager->create_task(MULTIPLY_TASK); + long task_id = 0; + HTask *multiply = manager->create_task(MULTIPLY_TASK1); multiply->set_cpu((CPU_TYPE)((int)SPE_0)); multiply->set_inData(0,(memaddr)A, sizeof(float)*length); multiply->set_inData(1,(memaddr)B, sizeof(float)*length); - + multiply->set_param(0,task_id++); multiply->set_outData(0,(memaddr)C, sizeof(float)*length); multiply->spawn(); @@ -91,7 +92,23 @@ multiply->set_inData(0,(memaddr)A, sizeof(float)*length); multiply->set_inData(1,(memaddr)B, sizeof(float)*length); + multiply->set_param(0,task_id++); + multiply->set_outData(0,(memaddr)C, sizeof(float)*length); + multiply->wait_for(previous); + + multiply->spawn(); + + previous = multiply; + } + + for(int i=1;i<4;i++) { + multiply = manager->create_task(MULTIPLY_TASK); + multiply->set_cpu((CPU_TYPE)((int)SPE_0+i+4)); + + multiply->set_inData(0,(memaddr)A, sizeof(float)*length); + multiply->set_inData(1,(memaddr)B, sizeof(float)*length); + multiply->set_param(0,task_id++); multiply->set_outData(0,(memaddr)C, sizeof(float)*length); multiply->wait_for(previous); diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/test/UtilizationTest/main.o Binary file TaskManager/test/UtilizationTest/main.o has changed diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/test/UtilizationTest/multiply Binary file TaskManager/test/UtilizationTest/multiply has changed diff -r ef1099c41449 -r 7673e2ad2623 TaskManager/test/UtilizationTest/ppe/Multi.cc --- a/TaskManager/test/UtilizationTest/ppe/Multi.cc Fri Oct 04 16:41:23 2013 +0900 +++ b/TaskManager/test/UtilizationTest/ppe/Multi.cc Fri Oct 04 19:44:09 2013 +0900 @@ -7,6 +7,8 @@ /* これは必須 */ SchedDefineTask(Multiply); +long current_task_id = -1; + static int run(SchedTask *s,void *rbuf, void *wbuf) { @@ -15,10 +17,15 @@ A = (float*)s->get_input(rbuf, 0); B = (float*)s->get_input(rbuf, 1); C = (float*)s->get_output(wbuf, 0); - + + long task_id = (long)s->get_param(0); + current_task_id = task_id; // long i = s->x; for(int i=0; i