Mercurial > hg > Game > Cerium
annotate TaskManager/kernel/ppe/Task.h @ 1602:e33e106ca3e0 draft
change default make parallel from fifo
author | Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 06 Apr 2013 17:27:30 +0900 |
parents | 57317332f6ef |
children | ac16a57f5dd7 |
rev | line source |
---|---|
276 | 1 #ifndef INCLUDED_TASK |
2 #define INCLUDED_TASK | |
3 | |
307 | 4 #include "base.h" |
5 #include "types.h" | |
6 #include "ListData.h" | |
625
94d82f2c842f
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
616
diff
changeset
|
7 #include "SimpleTask.h" |
276 | 8 |
688 | 9 class SchedTask; |
736 | 10 class Scheduler; |
688 | 11 |
684 | 12 class Task { |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
13 public: // variables |
689
ecf63089f5bb
Task Array generation worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
688
diff
changeset
|
14 int task_size; |
688 | 15 int command; |
696 | 16 int param_count; |
17 int inData_count; | |
18 int outData_count; | |
689
ecf63089f5bb
Task Array generation worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
688
diff
changeset
|
19 int inData_offset; |
ecf63089f5bb
Task Array generation worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
688
diff
changeset
|
20 int outData_offset; |
686 | 21 void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); |
684 | 22 |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
23 public: // functions |
687
25afcd4ae380
test code for TaskArray
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
686
diff
changeset
|
24 |
736 | 25 void print(Scheduler *s); |
687
25afcd4ae380
test code for TaskArray
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
686
diff
changeset
|
26 |
700 | 27 memaddr *param(int index) { |
1498
8034e0212281
run twice, but not return. dead lock?
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1480
diff
changeset
|
28 memaddr p = (memaddr)data + sizeof(memaddr)*index; |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
29 return (memaddr *)p; |
695 | 30 } |
31 | |
700 | 32 ListElement *inData(int index) { |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
33 memaddr p = (memaddr)data + inData_offset; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
34 p += sizeof(ListElement)*index; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
35 return (ListElement*)p; |
698
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
36 } |
696 | 37 |
700 | 38 ListElement *outData(int index) { |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
39 memaddr p = (memaddr)data + outData_offset; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
40 p += sizeof(ListElement)* index; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
41 return (ListElement*)p; |
686 | 42 } |
43 | |
696 | 44 static int calc_size(int params, int ins, int outs) { |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
45 int size = round_up16(sizeof(Task)) |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
46 + round_up16(sizeof(memaddr)*params) |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
47 + round_up16(sizeof(ListElement)*ins) |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
48 + round_up16(sizeof(ListElement)*outs); |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
49 return size; |
688 | 50 } |
51 | |
700 | 52 void init(int task_id, int params, int ins, int outs) { |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
53 set_task_id(task_id); |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
54 param_count = params; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
55 inData_count = ins; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
56 outData_count = outs; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
57 inData_offset = round_up16(sizeof(memaddr)*params); |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
58 outData_offset = round_up16(inData_offset+sizeof(ListElement)*ins); |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
59 //task_size = round_up16(sizeof(Task)+outData_offset+sizeof(ListElement)*outs); |
970
1a4849b2acad
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
949
diff
changeset
|
60 |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
61 task_size = round_up16(sizeof(Task)) |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
62 + round_up16(sizeof(memaddr)*params) |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
63 + round_up16(sizeof(ListElement)*ins) |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
64 + round_up16(sizeof(ListElement)*outs); |
970
1a4849b2acad
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
949
diff
changeset
|
65 |
700 | 66 } |
67 | |
68 int size() { | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
69 return task_size; |
700 | 70 } |
71 | |
72 int inData_total_size() { | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
73 int size = 0; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
74 ListElement *in= inData(0); |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
75 for(int i=0; i< inData_count; i++) { |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
76 size += in[i].size; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
77 } |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
78 return size; |
700 | 79 } |
80 int outData_total_size() { | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
81 int size = 0; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
82 ListElement *out= outData(0); |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
83 for(int i=0; i< outData_count; i++) { |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
84 size += out[i].size; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
85 } |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
86 return size; |
700 | 87 } |
88 | |
89 void set_inData_t( int index, memaddr addr, int size) { | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
90 ListElement *list = inData(index); |
949 | 91 #ifdef EARLY_TOUCH |
92 if ((unsigned long)addr&0xf) { | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
93 printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n", |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
94 command, index, (unsigned long)addr, size); |
949 | 95 } |
96 char *p = (char *)addr; int b = *p; | |
97 p = (char *)(addr+size-1); b += *p; | |
98 #endif | |
1480
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
970
diff
changeset
|
99 |
700 | 100 #ifdef __CERIUM_CELL__ |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
101 list->addr = (uint32)addr; |
700 | 102 #else |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
103 list->addr = addr; |
700 | 104 #endif |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
105 list->size = size; |
700 | 106 } |
107 | |
108 void set_outData_t(int index, memaddr addr, int size) { | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
109 ListElement *list = outData(index); |
949 | 110 #ifdef EARLY_TOUCH |
111 if ((unsigned long)addr&0xf) { | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
112 printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n", |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
113 command, index, (unsigned long)addr, size); |
949 | 114 } |
115 char *p = (char *)addr; int b = *p; | |
116 p = (char *)(addr+size-1); b += *p; | |
117 #endif | |
700 | 118 #ifdef __CERIUM_CELL__ |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
119 list->addr = (uint32)addr; |
700 | 120 #else |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
121 list->addr = addr; |
700 | 122 #endif |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
123 list->size = size; |
700 | 124 } |
125 void set_task_id(int id) { command = id; } | |
126 void set_param_t(int index, memaddr param) { | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
127 memaddr *p = (memaddr*)this->param(index); |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
128 *p = param; |
700 | 129 } |
130 | |
690 | 131 Task * next() |
132 { | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
133 char *p = (char*)this; |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
134 p += size(); |
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
135 return (Task*)p; |
690 | 136 } |
137 | |
138 | |
684 | 139 #define set_param(index,param) set_param_t(index, (memaddr) (param)) |
140 | |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
141 #define set_inData(index, addr, size) \ |
684 | 142 set_inData_t(index, (memaddr)(addr), (size)); |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1498
diff
changeset
|
143 #define set_outData(index, addr, size) \ |
684 | 144 set_outData_t(index, (memaddr)(addr), (size)); |
895
b662e9dd26b0
add alignment of classes in SPU
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
787
diff
changeset
|
145 } __attribute__ ((aligned (DEFAULT_ALIGNMENT))) ; |
276 | 146 |
147 typedef Task* TaskPtr; | |
148 | |
149 #endif |