annotate spe/SpeSentry.cc @ 3:8b4d6bf8c43d

add entry_head function
author yutaka@localhost.localdomain
date Wed, 07 Apr 2010 17:35:34 +0900
parents 1e1b0d280427
children 39d405bc46b7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
yutaka@localhost.localdomain
parents:
diff changeset
1 #include <stdio.h>
yutaka@localhost.localdomain
parents:
diff changeset
2 #include <malloc.h>
yutaka@localhost.localdomain
parents:
diff changeset
3 #include <spu_intrinsics.h>
yutaka@localhost.localdomain
parents:
diff changeset
4 #include <spu_mfcio.h>
yutaka@localhost.localdomain
parents:
diff changeset
5 #include "SpeSentry.h"
yutaka@localhost.localdomain
parents:
diff changeset
6 #include "MailCommand.h"
yutaka@localhost.localdomain
parents:
diff changeset
7 #include "Dma.h"
yutaka@localhost.localdomain
parents:
diff changeset
8 #include "Run.h"
yutaka@localhost.localdomain
parents:
diff changeset
9
yutaka@localhost.localdomain
parents:
diff changeset
10 void*
2
yutaka@localhost.localdomain
parents: 1
diff changeset
11 fix_type(task_t *task, void* buff)
0
yutaka@localhost.localdomain
parents:
diff changeset
12 {
yutaka@localhost.localdomain
parents:
diff changeset
13
yutaka@localhost.localdomain
parents:
diff changeset
14 char *p;
yutaka@localhost.localdomain
parents:
diff changeset
15 p = (char*)buff;
2
yutaka@localhost.localdomain
parents: 1
diff changeset
16 p = p + sizeof(task_head_t);
0
yutaka@localhost.localdomain
parents:
diff changeset
17
2
yutaka@localhost.localdomain
parents: 1
diff changeset
18 task->head = (task_head_t*)buff;
yutaka@localhost.localdomain
parents: 1
diff changeset
19 task->input = p;
0
yutaka@localhost.localdomain
parents:
diff changeset
20
yutaka@localhost.localdomain
parents:
diff changeset
21 }
yutaka@localhost.localdomain
parents:
diff changeset
22
yutaka@localhost.localdomain
parents:
diff changeset
23 void*
yutaka@localhost.localdomain
parents:
diff changeset
24 allocate(int size)
yutaka@localhost.localdomain
parents:
diff changeset
25 {
yutaka@localhost.localdomain
parents:
diff changeset
26
yutaka@localhost.localdomain
parents:
diff changeset
27 int alignment = 16;
yutaka@localhost.localdomain
parents:
diff changeset
28 return memalign(alignment, size);
yutaka@localhost.localdomain
parents:
diff changeset
29
yutaka@localhost.localdomain
parents:
diff changeset
30 }
yutaka@localhost.localdomain
parents:
diff changeset
31
2
yutaka@localhost.localdomain
parents: 1
diff changeset
32 task_t
0
yutaka@localhost.localdomain
parents:
diff changeset
33 task_allocate(int size)
yutaka@localhost.localdomain
parents:
diff changeset
34 {
yutaka@localhost.localdomain
parents:
diff changeset
35
yutaka@localhost.localdomain
parents:
diff changeset
36 if (size % 16) {
yutaka@localhost.localdomain
parents:
diff changeset
37 //printf("allocate size is not multiple of 16\n");
yutaka@localhost.localdomain
parents:
diff changeset
38 }
yutaka@localhost.localdomain
parents:
diff changeset
39
yutaka@localhost.localdomain
parents:
diff changeset
40 char *buff;
2
yutaka@localhost.localdomain
parents: 1
diff changeset
41 task_t task;
0
yutaka@localhost.localdomain
parents:
diff changeset
42
yutaka@localhost.localdomain
parents:
diff changeset
43 void *head;
yutaka@localhost.localdomain
parents:
diff changeset
44 head = memalign(16, size);
yutaka@localhost.localdomain
parents:
diff changeset
45
yutaka@localhost.localdomain
parents:
diff changeset
46 buff = (char*)head;
2
yutaka@localhost.localdomain
parents: 1
diff changeset
47 buff = buff + sizeof(task_head_t);
0
yutaka@localhost.localdomain
parents:
diff changeset
48
2
yutaka@localhost.localdomain
parents: 1
diff changeset
49 task.head = (task_head_t*)head;
yutaka@localhost.localdomain
parents: 1
diff changeset
50 task.input = buff;
0
yutaka@localhost.localdomain
parents:
diff changeset
51
2
yutaka@localhost.localdomain
parents: 1
diff changeset
52 return task;
0
yutaka@localhost.localdomain
parents:
diff changeset
53
yutaka@localhost.localdomain
parents:
diff changeset
54 }
yutaka@localhost.localdomain
parents:
diff changeset
55
yutaka@localhost.localdomain
parents:
diff changeset
56 int
yutaka@localhost.localdomain
parents:
diff changeset
57 main(unsigned long long spe, unsigned long long argp, unsigned long long envp)
yutaka@localhost.localdomain
parents:
diff changeset
58 {
yutaka@localhost.localdomain
parents:
diff changeset
59
yutaka@localhost.localdomain
parents:
diff changeset
60 uint32_t data;
yutaka@localhost.localdomain
parents:
diff changeset
61 int buff_num = 2;
2
yutaka@localhost.localdomain
parents: 1
diff changeset
62 unsigned int dma_wait_time = 0;
0
yutaka@localhost.localdomain
parents:
diff changeset
63
yutaka@localhost.localdomain
parents:
diff changeset
64 int in_tag[buff_num];
yutaka@localhost.localdomain
parents:
diff changeset
65 int out_tag[buff_num];
yutaka@localhost.localdomain
parents:
diff changeset
66
yutaka@localhost.localdomain
parents:
diff changeset
67 in_tag[0] = 0;
yutaka@localhost.localdomain
parents:
diff changeset
68 in_tag[1] = 1;
yutaka@localhost.localdomain
parents:
diff changeset
69
yutaka@localhost.localdomain
parents:
diff changeset
70 out_tag[0] = 2;
yutaka@localhost.localdomain
parents:
diff changeset
71 out_tag[1] = 3;
yutaka@localhost.localdomain
parents:
diff changeset
72
yutaka@localhost.localdomain
parents:
diff changeset
73 int head_tag = 4;
yutaka@localhost.localdomain
parents:
diff changeset
74
2
yutaka@localhost.localdomain
parents: 1
diff changeset
75 task_head_t *head = (task_head_t*)allocate(sizeof(task_head_t));
yutaka@localhost.localdomain
parents: 1
diff changeset
76 task_t *send_params = (task_t*)allocate(sizeof(task_t));
0
yutaka@localhost.localdomain
parents:
diff changeset
77 void *input_buff[buff_num];
yutaka@localhost.localdomain
parents:
diff changeset
78 void *output_buff[buff_num];
yutaka@localhost.localdomain
parents:
diff changeset
79
yutaka@localhost.localdomain
parents:
diff changeset
80 int cur;
yutaka@localhost.localdomain
parents:
diff changeset
81
yutaka@localhost.localdomain
parents:
diff changeset
82 spu_write_out_mbox(WANT_DATA);
yutaka@localhost.localdomain
parents:
diff changeset
83
yutaka@localhost.localdomain
parents:
diff changeset
84 while(1) {
yutaka@localhost.localdomain
parents:
diff changeset
85
yutaka@localhost.localdomain
parents:
diff changeset
86 //mail check start
yutaka@localhost.localdomain
parents:
diff changeset
87 if(spu_stat_in_mbox()) {
yutaka@localhost.localdomain
parents:
diff changeset
88
yutaka@localhost.localdomain
parents:
diff changeset
89 data = spu_read_in_mbox();
yutaka@localhost.localdomain
parents:
diff changeset
90
yutaka@localhost.localdomain
parents:
diff changeset
91 if (data == SPE_RUN_END) {
yutaka@localhost.localdomain
parents:
diff changeset
92
yutaka@localhost.localdomain
parents:
diff changeset
93 break;
yutaka@localhost.localdomain
parents:
diff changeset
94
yutaka@localhost.localdomain
parents:
diff changeset
95 } else {
yutaka@localhost.localdomain
parents:
diff changeset
96
yutaka@localhost.localdomain
parents:
diff changeset
97 //printf("[SPE] data %p\n",data);
yutaka@localhost.localdomain
parents:
diff changeset
98
2
yutaka@localhost.localdomain
parents: 1
diff changeset
99 dma_get(head, data, sizeof(task_head_t), head_tag);
1
dcd83cefb980 check , ppe_only, show time , function add.
yutaka@localhost.localdomain
parents: 0
diff changeset
100 dma_wait_time += dma_wait(head_tag);
0
yutaka@localhost.localdomain
parents:
diff changeset
101
yutaka@localhost.localdomain
parents:
diff changeset
102 input_buff[0] = allocate(head->next_task_size);
yutaka@localhost.localdomain
parents:
diff changeset
103
yutaka@localhost.localdomain
parents:
diff changeset
104 dma_get(input_buff[0], head->next_task, head->next_task_size, in_tag[0]);
1
dcd83cefb980 check , ppe_only, show time , function add.
yutaka@localhost.localdomain
parents: 0
diff changeset
105 dma_wait_time += dma_wait(in_tag[0]);
0
yutaka@localhost.localdomain
parents:
diff changeset
106
yutaka@localhost.localdomain
parents:
diff changeset
107 fix_type(send_params,input_buff[0]);
yutaka@localhost.localdomain
parents:
diff changeset
108
yutaka@localhost.localdomain
parents:
diff changeset
109 cur = 0;
yutaka@localhost.localdomain
parents:
diff changeset
110
yutaka@localhost.localdomain
parents:
diff changeset
111 while(1) {
yutaka@localhost.localdomain
parents:
diff changeset
112
yutaka@localhost.localdomain
parents:
diff changeset
113 input_buff[cur^1] = allocate(send_params->head->next_task_size);
yutaka@localhost.localdomain
parents:
diff changeset
114 dma_get(input_buff[cur^1], send_params->head->next_task, send_params->head->next_task_size, in_tag[cur^1]);
yutaka@localhost.localdomain
parents:
diff changeset
115
2
yutaka@localhost.localdomain
parents: 1
diff changeset
116 void *in = send_params->input;
0
yutaka@localhost.localdomain
parents:
diff changeset
117
yutaka@localhost.localdomain
parents:
diff changeset
118 //printf("hoge");
yutaka@localhost.localdomain
parents:
diff changeset
119 output_buff[cur] = allocate(send_params->head->size_out);
yutaka@localhost.localdomain
parents:
diff changeset
120
3
8b4d6bf8c43d add entry_head function
yutaka@localhost.localdomain
parents: 2
diff changeset
121 int size_in = send_params->head->size_in;
8b4d6bf8c43d add entry_head function
yutaka@localhost.localdomain
parents: 2
diff changeset
122 int size_out = send_params->head->size_out;
0
yutaka@localhost.localdomain
parents:
diff changeset
123
yutaka@localhost.localdomain
parents:
diff changeset
124 //task********************************************
yutaka@localhost.localdomain
parents:
diff changeset
125
3
8b4d6bf8c43d add entry_head function
yutaka@localhost.localdomain
parents: 2
diff changeset
126 run(in, output_buff[cur], size_in, size_out);
8b4d6bf8c43d add entry_head function
yutaka@localhost.localdomain
parents: 2
diff changeset
127
0
yutaka@localhost.localdomain
parents:
diff changeset
128 //end*********************************************
yutaka@localhost.localdomain
parents:
diff changeset
129
yutaka@localhost.localdomain
parents:
diff changeset
130 dma_put(output_buff[cur], send_params->head->ea_out, send_params->head->size_out, out_tag[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
131
yutaka@localhost.localdomain
parents:
diff changeset
132 free(input_buff[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
133
1
dcd83cefb980 check , ppe_only, show time , function add.
yutaka@localhost.localdomain
parents: 0
diff changeset
134 dma_wait_time += dma_wait(in_tag[cur^1]);
dcd83cefb980 check , ppe_only, show time , function add.
yutaka@localhost.localdomain
parents: 0
diff changeset
135 dma_wait_time += dma_wait(out_tag[cur^1]);
0
yutaka@localhost.localdomain
parents:
diff changeset
136 //printf("hoge");
yutaka@localhost.localdomain
parents:
diff changeset
137
yutaka@localhost.localdomain
parents:
diff changeset
138 free(output_buff[cur^1]);
yutaka@localhost.localdomain
parents:
diff changeset
139
yutaka@localhost.localdomain
parents:
diff changeset
140 cur ^= 1;
yutaka@localhost.localdomain
parents:
diff changeset
141
yutaka@localhost.localdomain
parents:
diff changeset
142 fix_type(send_params,input_buff[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
143
yutaka@localhost.localdomain
parents:
diff changeset
144 if ((unsigned long)send_params->head->next_task == 0) {
yutaka@localhost.localdomain
parents:
diff changeset
145 break;
yutaka@localhost.localdomain
parents:
diff changeset
146 }
yutaka@localhost.localdomain
parents:
diff changeset
147
yutaka@localhost.localdomain
parents:
diff changeset
148 }//while
yutaka@localhost.localdomain
parents:
diff changeset
149
yutaka@localhost.localdomain
parents:
diff changeset
150
2
yutaka@localhost.localdomain
parents: 1
diff changeset
151 void *in = send_params->input;
0
yutaka@localhost.localdomain
parents:
diff changeset
152
yutaka@localhost.localdomain
parents:
diff changeset
153 //printf("hoge");
yutaka@localhost.localdomain
parents:
diff changeset
154 output_buff[cur] = allocate(send_params->head->size_out);
3
8b4d6bf8c43d add entry_head function
yutaka@localhost.localdomain
parents: 2
diff changeset
155 int size_in = send_params->head->size_in;
8b4d6bf8c43d add entry_head function
yutaka@localhost.localdomain
parents: 2
diff changeset
156 int size_out = send_params->head->size_out;
0
yutaka@localhost.localdomain
parents:
diff changeset
157
yutaka@localhost.localdomain
parents:
diff changeset
158 //task********************************************
yutaka@localhost.localdomain
parents:
diff changeset
159
3
8b4d6bf8c43d add entry_head function
yutaka@localhost.localdomain
parents: 2
diff changeset
160 run(in, output_buff[cur], size_in, size_out);
0
yutaka@localhost.localdomain
parents:
diff changeset
161
yutaka@localhost.localdomain
parents:
diff changeset
162 //end*********************************************
yutaka@localhost.localdomain
parents:
diff changeset
163
yutaka@localhost.localdomain
parents:
diff changeset
164 dma_put(output_buff[cur], send_params->head->ea_out, send_params->head->size_out, out_tag[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
165
yutaka@localhost.localdomain
parents:
diff changeset
166 free(input_buff[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
167
1
dcd83cefb980 check , ppe_only, show time , function add.
yutaka@localhost.localdomain
parents: 0
diff changeset
168 dma_wait_time += dma_wait(out_tag[cur] | out_tag[cur^1] );
0
yutaka@localhost.localdomain
parents:
diff changeset
169 free(output_buff[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
170 free(output_buff[cur^1]);
yutaka@localhost.localdomain
parents:
diff changeset
171
yutaka@localhost.localdomain
parents:
diff changeset
172 spu_write_out_mbox(WANT_DATA);
yutaka@localhost.localdomain
parents:
diff changeset
173 //printf("[SPE] send mail\n");
yutaka@localhost.localdomain
parents:
diff changeset
174
yutaka@localhost.localdomain
parents:
diff changeset
175 }//if
yutaka@localhost.localdomain
parents:
diff changeset
176 }//if
yutaka@localhost.localdomain
parents:
diff changeset
177 //mail check end
yutaka@localhost.localdomain
parents:
diff changeset
178
yutaka@localhost.localdomain
parents:
diff changeset
179
yutaka@localhost.localdomain
parents:
diff changeset
180 }//while
yutaka@localhost.localdomain
parents:
diff changeset
181
1
dcd83cefb980 check , ppe_only, show time , function add.
yutaka@localhost.localdomain
parents: 0
diff changeset
182 printf("dma_wait_time %d\n",dma_wait_time);
0
yutaka@localhost.localdomain
parents:
diff changeset
183
yutaka@localhost.localdomain
parents:
diff changeset
184 return 0;
yutaka@localhost.localdomain
parents:
diff changeset
185
yutaka@localhost.localdomain
parents:
diff changeset
186 }
yutaka@localhost.localdomain
parents:
diff changeset
187
yutaka@localhost.localdomain
parents:
diff changeset
188
yutaka@localhost.localdomain
parents:
diff changeset
189 /*end*/