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