changeset 1698:7673e2ad2623 draft

fix profile
author kkb
date Fri, 04 Oct 2013 19:44:09 +0900
parents ef1099c41449
children 0a70abda2ab6
files TaskManager/Fifo/FifoDmaManager.cc TaskManager/Fifo/FifoDmaManager.h TaskManager/Fifo/PreRefDmaManager.cc TaskManager/Fifo/gettime.h TaskManager/Fifo/rdtsc.h TaskManager/kernel/schedule/DmaManager.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/test/UtilizationTest/Func.h TaskManager/test/UtilizationTest/main.cc TaskManager/test/UtilizationTest/main.o TaskManager/test/UtilizationTest/multiply TaskManager/test/UtilizationTest/ppe/Multi.cc TaskManager/test/UtilizationTest/ppe/Multi.o TaskManager/test/UtilizationTest/ppe/task_init.cc TaskManager/test/UtilizationTest/ppe/task_init.o
diffstat 15 files changed, 112 insertions(+), 87 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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);
 
 };
 
--- 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;
 }
--- 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 <time.h>
 #ifdef __APPLE__
-#include <sys/time.h>
+#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;
 
--- 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
--- 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) {}
--- 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 側で作る方法が必要...
     // 書き込む領域がなければ無視
--- 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
--- 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);
Binary file TaskManager/test/UtilizationTest/main.o has changed
Binary file TaskManager/test/UtilizationTest/multiply has changed
--- 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<DATA_NUM; i++) {
         C[i]=A[i]*B[i];
     }
+    if(current_task_id != task_id)
+        fprintf(stderr,"duplicate task %ld %ld\n",current_task_id,task_id);
+
     return 0;
 }
Binary file TaskManager/test/UtilizationTest/ppe/Multi.o has changed
--- a/TaskManager/test/UtilizationTest/ppe/task_init.cc	Fri Oct 04 16:41:23 2013 +0900
+++ b/TaskManager/test/UtilizationTest/ppe/task_init.cc	Fri Oct 04 19:44:09 2013 +0900
@@ -3,7 +3,7 @@
 
 /* 必ずこの位置に書いて */
 SchedExternTask(Multiply);
-
+SchedExternTask(Multiply1);
 /**
  * この関数は ../spe/spe-main と違って
  * 自分で呼び出せばいい関数なので
@@ -14,4 +14,5 @@
 task_init(void)
 {
   SchedRegisterTask(MULTIPLY_TASK, Multiply);
+  SchedRegisterTask(MULTIPLY_TASK1, Multiply1);
 }
Binary file TaskManager/test/UtilizationTest/ppe/task_init.o has changed