Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Cell/spe/CellDmaManager.cc @ 1001:61f33945f85d
error fix.
author | root@henri.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Thu, 21 Oct 2010 21:39:47 +0900 |
parents | 451ddde9a16d |
children | 18a548c337cb |
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 | |
85 memaddr CellDmaManager::mail_read() | |
86 { | |
87 (this->*start_dmawait_profile)(); | |
88 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
|
89 #if 0 |
672 | 90 if (ABIBIT>32) { |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
91 data += (spu_read_in_mbox()<<32); |
672 | 92 } |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
93 #endif |
675 | 94 (this->*end_dmawait_profile)(&global_mail_time); |
672 | 95 return data; |
96 } | |
97 | |
98 void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) | |
99 { | |
100 mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
101 mask, 0, 0); | |
102 } | |
103 | |
104 void CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) | |
105 { | |
106 mfc_putl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
107 mask, 0, 0); | |
108 } | |
109 | |
110 | |
111 CellDmaManager::CellDmaManager() | |
112 { | |
113 stop_profile(); | |
114 } | |
115 void | |
116 CellDmaManager::start_profile() | |
117 { | |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
118 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
119 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
120 global_wait_time = 0; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
121 task_array_load_time = 0; |
672 | 122 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
|
123 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
|
124 |
672 | 125 } |
126 | |
127 void | |
128 CellDmaManager::stop_profile() | |
129 { | |
130 start_dmawait_profile = &CellDmaManager::null_start_dmawait_profile; | |
131 end_dmawait_profile = &CellDmaManager::null_end_dmawait_profile; | |
132 } | |
133 | |
59 | 134 /** |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
135 * DMA Wait |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
136 * |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
137 * @param[in] mask Tag for Wait DMA process |
59 | 138 */ |
273 | 139 void |
672 | 140 CellDmaManager::do_start_dmawait_profile() |
242 | 141 { |
142 wait_time = spu_readch(SPU_RdDec); | |
143 global_busy_time += busy_time - wait_time; | |
144 spu_writech(SPU_WrDec, 0xffffffff); | |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
145 |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
146 // Measurement of mainMem_alloc |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
147 mainMemalloc_time += (alloc_busy_time - wait_time)*alloc_flag; |
242 | 148 } |
149 | |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
150 |
273 | 151 void |
676 | 152 CellDmaManager::do_end_dmawait_profile(unsigned long long *counter) |
242 | 153 { |
154 wait_time = spu_readch(SPU_RdDec); | |
675 | 155 *counter += 0xffffffff - wait_time; |
242 | 156 busy_time = wait_time; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
157 |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
158 // Measurement of mainMem_alloc |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
159 alloc_busy_time = wait_time; |
242 | 160 } |
239 | 161 |
672 | 162 void CellDmaManager::null_start_dmawait_profile() {} |
676 | 163 void CellDmaManager::null_end_dmawait_profile(unsigned long long *counter) {} |
672 | 164 |
239 | 165 void |
736 | 166 CellDmaManager::show_dma_wait(Scheduler *s, int cpu) |
255 | 167 { |
168 | |
675 | 169 double r = ((double)global_busy_time)/((double)( |
170 global_busy_time+global_wait_time+global_mail_time | |
676 | 171 ))*100.0; |
924 | 172 |
173 double d = ((double)global_wait_time)/((double)( | |
174 global_busy_time+global_wait_time+global_mail_time | |
175 ))*100.0; | |
176 | |
177 double m = ((double)global_mail_time)/((double)( | |
178 global_busy_time+global_wait_time+global_mail_time | |
179 ))*100.0; | |
180 | |
736 | 181 s->printf("spu%d: busy_time = %lld" |
924 | 182 " wait_time = %lld(%.3g%%), " |
183 " mail_time = %lld(%.3g%%), " | |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
184 " busy_ratio = %.3g%%" |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
185 " array_load_time = %lld\n" |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
186 " 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
|
187 ,cpu, global_busy_time, |
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
188 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
|
189 task_array_load_time, |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
190 mainMemalloc_time); |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
191 |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
192 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
193 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
194 global_wait_time = 0; |
970
33630c6ff445
change pipeline and TaskArray fast
Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
925
diff
changeset
|
195 task_array_load_time = 0; |
999
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
196 mainMemalloc_time = 0; |
451ddde9a16d
Measurement of mainMem_alloc at waiting time. not done.
tkaito
parents:
970
diff
changeset
|
197 alloc_flag = 0; |
255 | 198 } |
199 | |
604 | 200 |
201 /* end */ |