Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Cell/spe/CellDmaManager.cc @ 925:9da903858400
add profile in Redering Engine
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 30 Jul 2010 16:57:17 +0900 |
parents | ad6903dd6419 |
children | 33630c6ff445 |
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 | |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
7 /** |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
8 * DMA Load |
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 * @param[in] buf Buffer of Load Data |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
11 * @param[in] addr Address of Load Data at Main Memory |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
12 * @param[in] size Size of Load Data |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
13 * @param[in] mask DMA tag |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
14 */ |
672 | 15 void CellDmaManager::dma_load(void *buf, memaddr addr, uint32 size, uint32 mask) |
59 | 16 { |
88 | 17 if (size == 0) return ; |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
18 mfc_get((volatile void *)buf, addr, size, mask, 0, 0); |
59 | 19 } |
20 | |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
21 /** |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
22 * DMA Store |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
23 * |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
24 * @param[in] buf Buffer of Store Data at SPE |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
25 * @param[in] addr Address of Store Data at Main Memory |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
26 * @param[in] size Size of Store Data |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
27 * @param[in] mask DMA tag |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
28 */ |
672 | 29 void CellDmaManager::dma_store(void *buf, memaddr addr, uint32 size, uint32 mask) |
59 | 30 { |
88 | 31 if (size == 0) return ; |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
32 mfc_put((volatile void *)buf, addr, size, mask, 0, 0); |
59 | 33 } |
34 | |
672 | 35 void CellDmaManager::dma_wait(uint32 mask) |
36 { | |
37 (this->*start_dmawait_profile)(); | |
38 mfc_write_tag_mask(1 << mask); | |
39 mfc_write_tag_update_all(); | |
40 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
|
41 __asm__ __volatile__(" sync"); |
675 | 42 (this->*end_dmawait_profile)(&global_wait_time); |
672 | 43 } |
44 | |
45 void CellDmaManager::mail_write(memaddr data) | |
46 { | |
47 (this->*start_dmawait_profile)(); | |
48 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
|
49 #if 0 |
672 | 50 if (ABIBIT>32) { |
51 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
|
52 spu_write_out_mbox((uint32)(data0>>32)); |
672 | 53 } |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
54 #endif |
675 | 55 (this->*end_dmawait_profile)(&global_mail_time); |
672 | 56 } |
57 | |
58 memaddr CellDmaManager::mail_read() | |
59 { | |
60 (this->*start_dmawait_profile)(); | |
61 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
|
62 #if 0 |
672 | 63 if (ABIBIT>32) { |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
64 data += (spu_read_in_mbox()<<32); |
672 | 65 } |
871
ab3cd3aeacff
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
66 #endif |
675 | 67 (this->*end_dmawait_profile)(&global_mail_time); |
672 | 68 return data; |
69 } | |
70 | |
71 void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) | |
72 { | |
73 mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
74 mask, 0, 0); | |
75 } | |
76 | |
77 void CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) | |
78 { | |
79 mfc_putl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
80 mask, 0, 0); | |
81 } | |
82 | |
83 | |
84 CellDmaManager::CellDmaManager() | |
85 { | |
86 stop_profile(); | |
87 } | |
88 | |
89 void | |
90 CellDmaManager::start_profile() | |
91 { | |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
92 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
93 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
94 global_wait_time = 0; |
672 | 95 start_dmawait_profile = &CellDmaManager::do_start_dmawait_profile; |
96 end_dmawait_profile = &CellDmaManager::do_end_dmawait_profile; | |
97 } | |
98 | |
99 void | |
100 CellDmaManager::stop_profile() | |
101 { | |
102 start_dmawait_profile = &CellDmaManager::null_start_dmawait_profile; | |
103 end_dmawait_profile = &CellDmaManager::null_end_dmawait_profile; | |
104 } | |
105 | |
59 | 106 /** |
180
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
107 * DMA Wait |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
108 * |
5cde66c926b4
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
109 * @param[in] mask Tag for Wait DMA process |
59 | 110 */ |
273 | 111 void |
672 | 112 CellDmaManager::do_start_dmawait_profile() |
242 | 113 { |
114 wait_time = spu_readch(SPU_RdDec); | |
115 global_busy_time += busy_time - wait_time; | |
116 spu_writech(SPU_WrDec, 0xffffffff); | |
117 } | |
118 | |
273 | 119 void |
676 | 120 CellDmaManager::do_end_dmawait_profile(unsigned long long *counter) |
242 | 121 { |
122 wait_time = spu_readch(SPU_RdDec); | |
675 | 123 *counter += 0xffffffff - wait_time; |
242 | 124 busy_time = wait_time; |
125 } | |
239 | 126 |
672 | 127 void CellDmaManager::null_start_dmawait_profile() {} |
676 | 128 void CellDmaManager::null_end_dmawait_profile(unsigned long long *counter) {} |
672 | 129 |
239 | 130 void |
736 | 131 CellDmaManager::show_dma_wait(Scheduler *s, int cpu) |
255 | 132 { |
133 | |
675 | 134 double r = ((double)global_busy_time)/((double)( |
135 global_busy_time+global_wait_time+global_mail_time | |
676 | 136 ))*100.0; |
924 | 137 |
138 double d = ((double)global_wait_time)/((double)( | |
139 global_busy_time+global_wait_time+global_mail_time | |
140 ))*100.0; | |
141 | |
142 double m = ((double)global_mail_time)/((double)( | |
143 global_busy_time+global_wait_time+global_mail_time | |
144 ))*100.0; | |
145 | |
736 | 146 s->printf("spu%d: busy_time = %lld" |
924 | 147 " wait_time = %lld(%.3g%%), " |
148 " mail_time = %lld(%.3g%%), " | |
149 " busy_ratio = %.3g%%\n", cpu, global_busy_time, | |
150 global_wait_time, d, global_mail_time, m, r); | |
925
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
151 |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
152 global_busy_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
153 global_mail_time = 0; |
9da903858400
add profile in Redering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
924
diff
changeset
|
154 global_wait_time = 0; |
255 | 155 } |
156 | |
604 | 157 |
158 /* end */ |