Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Cell/spe/CellDmaManager.cc @ 1023:5245cf19775d
comment remove
author | yutaka@localhost.localdomain |
---|---|
date | Sun, 07 Nov 2010 22:18:41 +0900 |
parents | f8e9c985e2a8 |
children | 19a57960c436 |
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; |
1009 | 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)(); | |
1009 | 91 if (0 != spu_readchcnt(SPU_WrOutMbox)) { |
1021 | 92 if (mail_queue->count()) { |
1007 | 93 spu_write_out_mbox((uint32)data); |
94 } else { | |
1021 | 95 |
96 //mail_queue から poll する | |
97 spu_write_out_mbox((uint32)mail_queue->recv()); | |
98 //mail_queue に加える | |
99 mail_queue->send(data); | |
100 | |
1007 | 101 } |
102 } else { | |
1021 | 103 |
104 mail_queue->send(data); | |
105 | |
1007 | 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 | |
1021 | 116 while (mail_queue->count()) { |
117 | |
118 spu_write_out_mbox((uint32)mail_queue->recv()); | |
119 | |
1007 | 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 { | |
1009 | 155 |
1021 | 156 mail_queue = new MailManager(); |
672 | 157 stop_profile(); |
158 } | |
159 void | |
160 CellDmaManager::start_profile() | |
161 { | |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
162 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
163 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
164 global_wait_time = 0; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
165 task_array_load_time = 0; |
672 | 166 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
|
167 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
|
168 |
672 | 169 } |
170 | |
171 void | |
172 CellDmaManager::stop_profile() | |
173 { | |
174 start_dmawait_profile = &CellDmaManager::null_start_dmawait_profile; | |
175 end_dmawait_profile = &CellDmaManager::null_end_dmawait_profile; | |
176 } | |
177 | |
59 | 178 /** |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
179 * DMA Wait |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
180 * |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
181 * @param[in] mask Tag for Wait DMA process |
59 | 182 */ |
273 | 183 void |
672 | 184 CellDmaManager::do_start_dmawait_profile() |
242 | 185 { |
186 wait_time = spu_readch(SPU_RdDec); | |
187 global_busy_time += busy_time - wait_time; | |
188 spu_writech(SPU_WrDec, 0xffffffff); | |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
189 |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
190 // Measurement of mainMem_alloc |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
191 mainMemalloc_time += (alloc_busy_time - wait_time)*alloc_flag; |
242 | 192 } |
193 | |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
194 |
273 | 195 void |
676 | 196 CellDmaManager::do_end_dmawait_profile(unsigned long long *counter) |
242 | 197 { |
198 wait_time = spu_readch(SPU_RdDec); | |
675 | 199 *counter += 0xffffffff - wait_time; |
242 | 200 busy_time = wait_time; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
201 |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
202 // Measurement of mainMem_alloc |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
203 alloc_busy_time = wait_time; |
242 | 204 } |
239 | 205 |
672 | 206 void CellDmaManager::null_start_dmawait_profile() {} |
676 | 207 void CellDmaManager::null_end_dmawait_profile(unsigned long long *counter) {} |
672 | 208 |
239 | 209 void |
736 | 210 CellDmaManager::show_dma_wait(Scheduler *s, int cpu) |
255 | 211 { |
212 | |
675 | 213 double r = ((double)global_busy_time)/((double)( |
214 global_busy_time+global_wait_time+global_mail_time | |
676 | 215 ))*100.0; |
924 | 216 |
217 double d = ((double)global_wait_time)/((double)( | |
218 global_busy_time+global_wait_time+global_mail_time | |
219 ))*100.0; | |
220 | |
221 double m = ((double)global_mail_time)/((double)( | |
222 global_busy_time+global_wait_time+global_mail_time | |
223 ))*100.0; | |
224 | |
736 | 225 s->printf("spu%d: busy_time = %lld" |
924 | 226 " wait_time = %lld(%.3g%%), " |
227 " mail_time = %lld(%.3g%%), " | |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
228 " busy_ratio = %.3g%%" |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
229 " array_load_time = %lld\n" |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
230 " 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
|
231 ,cpu, global_busy_time, |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
232 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
|
233 task_array_load_time, |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
234 mainMemalloc_time); |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
235 |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
236 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
237 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
238 global_wait_time = 0; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
239 task_array_load_time = 0; |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
240 mainMemalloc_time = 0; |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
241 alloc_flag = 0; |
255 | 242 } |
243 | |
604 | 244 |
245 /* end */ |