Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Cell/spe/CellDmaManager.cc @ 1007:18a548c337cb
add mail_queue
author | yutaka@localhost.localdomain |
---|---|
date | Thu, 28 Oct 2010 08:39:19 +0900 |
parents | 61f33945f85d |
children | c67379f9d411 |
rev | line source |
---|---|
61 | 1 #include <stdio.h> |
88 | 2 #include <stdlib.h> |
59 | 3 #include "CellDmaManager.h" |
736 | 4 #include "Scheduler.h" |
672 | 5 |
6 | |
1001 | 7 unsigned long long alloc_flag = 0; |
8 | |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
9 /** |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
10 * DMA Load |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
11 * |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
12 * @param[in] buf Buffer of Load Data |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
13 * @param[in] addr Address of Load Data at Main Memory |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
14 * @param[in] size Size of Load Data |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
15 * @param[in] mask DMA tag |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
16 */ |
672 | 17 void CellDmaManager::dma_load(void *buf, memaddr addr, uint32 size, uint32 mask) |
59 | 18 { |
88 | 19 if (size == 0) return ; |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
20 mfc_get((volatile void *)buf, addr, size, mask, 0, 0); |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
21 |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
22 |
59 | 23 } |
24 | |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
25 /** |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
26 * DMA Store |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
27 * |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
28 * @param[in] buf Buffer of Store Data at SPE |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
29 * @param[in] addr Address of Store Data at Main Memory |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
30 * @param[in] size Size of Store Data |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
31 * @param[in] mask DMA tag |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
32 */ |
672 | 33 void CellDmaManager::dma_store(void *buf, memaddr addr, uint32 size, uint32 mask) |
59 | 34 { |
88 | 35 if (size == 0) return ; |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
36 mfc_put((volatile void *)buf, addr, size, mask, 0, 0); |
59 | 37 } |
38 | |
672 | 39 void CellDmaManager::dma_wait(uint32 mask) |
40 { | |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
41 |
672 | 42 (this->*start_dmawait_profile)(); |
43 mfc_write_tag_mask(1 << mask); | |
44 mfc_write_tag_update_all(); | |
45 mfc_read_tag_status(); | |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
46 __asm__ __volatile__(" sync"); |
675 | 47 (this->*end_dmawait_profile)(&global_wait_time); |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
48 |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
49 } |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
50 |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
51 void CellDmaManager::dma_wait(uint32 mask, int cmd) |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
52 { |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
53 |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
54 unsigned long long wait = 0; |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
55 |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
56 (this->*start_dmawait_profile)(); |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
57 mfc_write_tag_mask(1 << mask); |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
58 mfc_write_tag_update_all(); |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
59 mfc_read_tag_status(); |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
60 __asm__ __volatile__(" sync"); |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
61 (this->*end_dmawait_profile)(&wait); |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
62 |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
63 global_wait_time += wait; |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
64 |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
65 if (cmd == TaskArray) { |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
66 task_array_load_time += wait; |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
67 } else if (cmd == TaskArray1) { |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
68 } |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
69 |
672 | 70 } |
71 | |
72 void CellDmaManager::mail_write(memaddr data) | |
73 { | |
74 (this->*start_dmawait_profile)(); | |
75 spu_write_out_mbox((uint32)data); | |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
76 #if 0 |
672 | 77 if (ABIBIT>32) { |
78 unsigned long data0 = (unsigned long)data; | |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
79 spu_write_out_mbox((uint32)(data0>>32)); |
672 | 80 } |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
81 #endif |
675 | 82 (this->*end_dmawait_profile)(&global_mail_time); |
672 | 83 } |
84 | |
1007 | 85 // mail を queue にしたみた。mailの書き出しの待ちあるのかわからないけど |
86 //TASK_LIST_MAIL は仕事が最後に溜まってしまうけど、MailQueueなら出来る時にmailを書き出す | |
87 //ので多少は効果あるといいな。 | |
88 void CellDmaManager::mail_write_queue(memaddr data) | |
89 { | |
90 (this->*start_dmawait_profile)(); | |
91 if (0 == spu_readchcnt(SPU_WrOutMbox)) { | |
92 if (mail_queue.empty()) { | |
93 spu_write_out_mbox((uint32)data); | |
94 } else { | |
95 MailQueuePtr mail = mail_queue.getFirst(); | |
96 spu_write_out_mbox((uint32)mail->data); | |
97 mail_queue.free_(mail); | |
98 mail = mail_queue.create(); | |
99 mail->data = data; | |
100 mail_queue.addLast(mail); | |
101 } | |
102 } else { | |
103 MailQueuePtr mail = mail_queue.create(); | |
104 mail->data = data; | |
105 mail_queue.addLast(mail); | |
106 } | |
107 (this->*end_dmawait_profile)(&global_mail_time); | |
108 } | |
109 | |
110 // tasklist おわりに、MailQueue 全部を書き出す | |
111 void CellDmaManager::mail_write_finish_list(memaddr data) | |
112 { | |
113 | |
114 (this->*start_dmawait_profile)(); | |
115 | |
116 while (!mail_queue.empty()) { | |
117 MailQueuePtr mail = mail_queue.getFirst(); | |
118 spu_write_out_mbox((uint32)mail->data); | |
119 mail_queue.free_(mail); | |
120 } | |
121 | |
122 spu_write_out_mbox((uint32)data); | |
123 | |
124 (this->*end_dmawait_profile)(&global_mail_time); | |
125 } | |
126 | |
672 | 127 memaddr CellDmaManager::mail_read() |
128 { | |
129 (this->*start_dmawait_profile)(); | |
130 memaddr data = (memaddr)spu_read_in_mbox(); | |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
131 #if 0 |
672 | 132 if (ABIBIT>32) { |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
133 data += (spu_read_in_mbox()<<32); |
672 | 134 } |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
135 #endif |
675 | 136 (this->*end_dmawait_profile)(&global_mail_time); |
672 | 137 return data; |
138 } | |
139 | |
140 void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) | |
141 { | |
142 mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
143 mask, 0, 0); | |
144 } | |
145 | |
146 void CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) | |
147 { | |
148 mfc_putl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
149 mask, 0, 0); | |
150 } | |
151 | |
152 | |
153 CellDmaManager::CellDmaManager() | |
154 { | |
155 stop_profile(); | |
156 } | |
157 void | |
158 CellDmaManager::start_profile() | |
159 { | |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
160 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
161 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
162 global_wait_time = 0; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
163 task_array_load_time = 0; |
672 | 164 start_dmawait_profile = &CellDmaManager::do_start_dmawait_profile; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
165 end_dmawait_profile = &CellDmaManager::do_end_dmawait_profile; |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
166 |
672 | 167 } |
168 | |
169 void | |
170 CellDmaManager::stop_profile() | |
171 { | |
172 start_dmawait_profile = &CellDmaManager::null_start_dmawait_profile; | |
173 end_dmawait_profile = &CellDmaManager::null_end_dmawait_profile; | |
174 } | |
175 | |
59 | 176 /** |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
177 * DMA Wait |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
178 * |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
179 * @param[in] mask Tag for Wait DMA process |
59 | 180 */ |
273 | 181 void |
672 | 182 CellDmaManager::do_start_dmawait_profile() |
242 | 183 { |
184 wait_time = spu_readch(SPU_RdDec); | |
185 global_busy_time += busy_time - wait_time; | |
186 spu_writech(SPU_WrDec, 0xffffffff); | |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
187 |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
188 // Measurement of mainMem_alloc |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
189 mainMemalloc_time += (alloc_busy_time - wait_time)*alloc_flag; |
242 | 190 } |
191 | |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
192 |
273 | 193 void |
676 | 194 CellDmaManager::do_end_dmawait_profile(unsigned long long *counter) |
242 | 195 { |
196 wait_time = spu_readch(SPU_RdDec); | |
675 | 197 *counter += 0xffffffff - wait_time; |
242 | 198 busy_time = wait_time; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
199 |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
200 // Measurement of mainMem_alloc |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
201 alloc_busy_time = wait_time; |
242 | 202 } |
239 | 203 |
672 | 204 void CellDmaManager::null_start_dmawait_profile() {} |
676 | 205 void CellDmaManager::null_end_dmawait_profile(unsigned long long *counter) {} |
672 | 206 |
239 | 207 void |
736 | 208 CellDmaManager::show_dma_wait(Scheduler *s, int cpu) |
255 | 209 { |
210 | |
675 | 211 double r = ((double)global_busy_time)/((double)( |
212 global_busy_time+global_wait_time+global_mail_time | |
676 | 213 ))*100.0; |
924 | 214 |
215 double d = ((double)global_wait_time)/((double)( | |
216 global_busy_time+global_wait_time+global_mail_time | |
217 ))*100.0; | |
218 | |
219 double m = ((double)global_mail_time)/((double)( | |
220 global_busy_time+global_wait_time+global_mail_time | |
221 ))*100.0; | |
222 | |
736 | 223 s->printf("spu%d: busy_time = %lld" |
924 | 224 " wait_time = %lld(%.3g%%), " |
225 " mail_time = %lld(%.3g%%), " | |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
226 " busy_ratio = %.3g%%" |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
227 " array_load_time = %lld\n" |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
228 " mainMem_alloc_time = %lld\n" |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
229 ,cpu, global_busy_time, |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
230 global_wait_time, d, global_mail_time, m, r, |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
231 task_array_load_time, |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
232 mainMemalloc_time); |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
233 |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
234 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
235 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
236 global_wait_time = 0; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
237 task_array_load_time = 0; |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
238 mainMemalloc_time = 0; |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
239 alloc_flag = 0; |
255 | 240 } |
241 | |
604 | 242 |
243 /* end */ |