Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Cell/spe/CellDmaManager.cc @ 1009:c67379f9d411
not yet....
author | yutaka@localhost.localdomain |
---|---|
date | Thu, 28 Oct 2010 13:00:51 +0900 |
parents | 18a548c337cb |
children | 44b2c4cb539d |
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 | |
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(); |
98 if (mail == NULL) { | |
99 printf("あっるえぇー、おっかっしぃぞぉー\n"); | |
100 } | |
1007 | 101 spu_write_out_mbox((uint32)mail->data); |
1009 | 102 mail_queue->free_(mail); |
103 mail = mail_queue->create(); | |
1007 | 104 mail->data = data; |
1009 | 105 mail_queue->addLast(mail); |
1007 | 106 } |
107 } else { | |
1009 | 108 MailQueuePtr mail = mail_queue->create(); |
1007 | 109 mail->data = data; |
1009 | 110 mail_queue->addLast(mail); |
1007 | 111 } |
112 (this->*end_dmawait_profile)(&global_mail_time); | |
113 } | |
114 | |
115 // tasklist おわりに、MailQueue 全部を書き出す | |
116 void CellDmaManager::mail_write_finish_list(memaddr data) | |
117 { | |
118 | |
119 (this->*start_dmawait_profile)(); | |
120 | |
1009 | 121 while (!mail_queue->empty()) { |
122 MailQueuePtr mail = mail_queue->poll(); | |
1007 | 123 spu_write_out_mbox((uint32)mail->data); |
1009 | 124 mail_queue->free_(mail); |
1007 | 125 } |
126 | |
127 spu_write_out_mbox((uint32)data); | |
1009 | 128 //mail_queue.freePool(); |
1007 | 129 |
130 (this->*end_dmawait_profile)(&global_mail_time); | |
131 } | |
132 | |
672 | 133 memaddr CellDmaManager::mail_read() |
134 { | |
135 (this->*start_dmawait_profile)(); | |
136 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
|
137 #if 0 |
672 | 138 if (ABIBIT>32) { |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
139 data += (spu_read_in_mbox()<<32); |
672 | 140 } |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
141 #endif |
675 | 142 (this->*end_dmawait_profile)(&global_mail_time); |
672 | 143 return data; |
144 } | |
145 | |
146 void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) | |
147 { | |
148 mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
149 mask, 0, 0); | |
150 } | |
151 | |
152 void CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) | |
153 { | |
154 mfc_putl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
155 mask, 0, 0); | |
156 } | |
157 | |
158 | |
159 CellDmaManager::CellDmaManager() | |
160 { | |
1009 | 161 |
162 mail_queue = new QueueInfo<MailQueue>(MailPool); | |
163 | |
672 | 164 stop_profile(); |
165 } | |
166 void | |
167 CellDmaManager::start_profile() | |
168 { | |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
169 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
170 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
171 global_wait_time = 0; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
172 task_array_load_time = 0; |
672 | 173 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
|
174 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
|
175 |
672 | 176 } |
177 | |
178 void | |
179 CellDmaManager::stop_profile() | |
180 { | |
181 start_dmawait_profile = &CellDmaManager::null_start_dmawait_profile; | |
182 end_dmawait_profile = &CellDmaManager::null_end_dmawait_profile; | |
183 } | |
184 | |
59 | 185 /** |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
186 * DMA Wait |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
187 * |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
188 * @param[in] mask Tag for Wait DMA process |
59 | 189 */ |
273 | 190 void |
672 | 191 CellDmaManager::do_start_dmawait_profile() |
242 | 192 { |
193 wait_time = spu_readch(SPU_RdDec); | |
194 global_busy_time += busy_time - wait_time; | |
195 spu_writech(SPU_WrDec, 0xffffffff); | |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
196 |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
197 // Measurement of mainMem_alloc |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
198 mainMemalloc_time += (alloc_busy_time - wait_time)*alloc_flag; |
242 | 199 } |
200 | |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
201 |
273 | 202 void |
676 | 203 CellDmaManager::do_end_dmawait_profile(unsigned long long *counter) |
242 | 204 { |
205 wait_time = spu_readch(SPU_RdDec); | |
675 | 206 *counter += 0xffffffff - wait_time; |
242 | 207 busy_time = wait_time; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
208 |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
209 // Measurement of mainMem_alloc |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
210 alloc_busy_time = wait_time; |
242 | 211 } |
239 | 212 |
672 | 213 void CellDmaManager::null_start_dmawait_profile() {} |
676 | 214 void CellDmaManager::null_end_dmawait_profile(unsigned long long *counter) {} |
672 | 215 |
239 | 216 void |
736 | 217 CellDmaManager::show_dma_wait(Scheduler *s, int cpu) |
255 | 218 { |
219 | |
675 | 220 double r = ((double)global_busy_time)/((double)( |
221 global_busy_time+global_wait_time+global_mail_time | |
676 | 222 ))*100.0; |
924 | 223 |
224 double d = ((double)global_wait_time)/((double)( | |
225 global_busy_time+global_wait_time+global_mail_time | |
226 ))*100.0; | |
227 | |
228 double m = ((double)global_mail_time)/((double)( | |
229 global_busy_time+global_wait_time+global_mail_time | |
230 ))*100.0; | |
231 | |
736 | 232 s->printf("spu%d: busy_time = %lld" |
924 | 233 " wait_time = %lld(%.3g%%), " |
234 " mail_time = %lld(%.3g%%), " | |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
235 " busy_ratio = %.3g%%" |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
236 " array_load_time = %lld\n" |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
237 " 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
|
238 ,cpu, global_busy_time, |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
239 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
|
240 task_array_load_time, |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
241 mainMemalloc_time); |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
242 |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
243 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
244 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
245 global_wait_time = 0; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
246 task_array_load_time = 0; |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
247 mainMemalloc_time = 0; |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
248 alloc_flag = 0; |
255 | 249 } |
250 | |
604 | 251 |
252 /* end */ |