Mercurial > hg > Members > kono > Cerium
comparison example/word_count_test/main.cc @ 667:d753b4f6b129
SimpeTask WordCount Worked.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 03 Dec 2009 04:23:36 +0900 |
parents | 4615489c5faa |
children | 4af9d20cf3af |
comparison
equal
deleted
inserted
replaced
666:4615489c5faa | 667:d753b4f6b129 |
---|---|
7 #include <fcntl.h> | 7 #include <fcntl.h> |
8 #include <unistd.h> | 8 #include <unistd.h> |
9 #include "TaskManager.h" | 9 #include "TaskManager.h" |
10 #include "SchedTask.h" | 10 #include "SchedTask.h" |
11 #include "Func.h" | 11 #include "Func.h" |
12 #include "WordCount.h" | |
12 | 13 |
13 extern void task_init(); | 14 extern void task_init(); |
14 | 15 |
15 const char *usr_help_str = "Usage: ./word_count [-cpu spe_num] [-file filename]\n"; | 16 const char *usr_help_str = "Usage: ./word_count [-cpu spe_num] [-file filename]\n"; |
16 | 17 |
17 typedef struct { | 18 typedef struct { |
18 caddr_t file_mmap; | 19 caddr_t file_mmap; |
19 off_t size; | 20 off_t size; |
20 } st_mmap_t; | 21 } st_mmap_t; |
21 | 22 |
22 typedef struct { | |
23 int size; // remaining file size | |
24 int division_size; // for each word count task | |
25 int division_out_size; | |
26 int task_num; // remaining task count | |
27 int task_blocks; // spawn task one at a time | |
28 int status_num; | |
29 int task_spwaned; | |
30 unsigned long long *o_data; | |
31 unsigned long long *head_tail_flag; | |
32 int pad; | |
33 caddr_t file_mmap; | |
34 HTaskPtr t_print; | |
35 } WordCount; | |
36 | 23 |
37 | 24 |
38 /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/ | 25 /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/ |
39 static int | 26 static int |
40 fix_byte(int size,int fix_byte_size) | 27 fix_byte(int size,int fix_byte_size) |
84 static void | 71 static void |
85 run_tasks(SchedTask *manager, WordCount *w, int task_count, HTaskPtr t_next, int size) | 72 run_tasks(SchedTask *manager, WordCount *w, int task_count, HTaskPtr t_next, int size) |
86 { | 73 { |
87 for (int j = 0; j < task_count && w->size>0; j++) { | 74 for (int j = 0; j < task_count && w->size>0; j++) { |
88 int i = w->task_spwaned++; | 75 int i = w->task_spwaned++; |
76 #ifdef SIMPLE_TASK | |
77 // printf("div %0x\n", (w->file_mmap + i*w->division_size)); | |
78 HTaskPtr t_exec = manager->create_task(TASK_EXEC, | |
79 (memaddr)(w->file_mmap + i*w->division_size), size, | |
80 (memaddr)(w->o_data + i*w->out_size), w->division_out_size); | |
81 #else | |
89 HTaskPtr t_exec = manager->create_task(TASK_EXEC); | 82 HTaskPtr t_exec = manager->create_task(TASK_EXEC); |
90 if (size>w->size) size = w->size; | 83 if (size>w->size) size = w->size; |
91 t_exec->add_inData(w->file_mmap + i*w->division_size, size); | 84 t_exec->add_inData(w->file_mmap + i*w->division_size, size); |
92 t_exec->add_outData(w->o_data + i*w->status_num, w->division_out_size); | 85 t_exec->add_outData(w->o_data + i*w->status_num, w->division_out_size); |
93 t_exec->add_outData(w->head_tail_flag + i*w->pad, w->division_out_size); | 86 t_exec->add_outData(w->head_tail_flag + i*w->pad, w->division_out_size); |
94 t_exec->add_param(size); | 87 t_exec->add_param(size); |
88 #endif | |
95 t_exec->set_cpu(SPE_ANY); | 89 t_exec->set_cpu(SPE_ANY); |
96 t_next->wait_for(t_exec); | 90 t_next->wait_for(t_exec); |
97 t_exec->spawn(); | 91 t_exec->spawn(); |
98 w->size -= size; | 92 w->size -= size; |
99 w->task_num--; | 93 w->task_num--; |
103 SchedDefineTask1(RUN_TASK_BLOCKS,run16); | 97 SchedDefineTask1(RUN_TASK_BLOCKS,run16); |
104 | 98 |
105 static int | 99 static int |
106 run16(SchedTask *manager, void *in, void *out) | 100 run16(SchedTask *manager, void *in, void *out) |
107 { | 101 { |
102 #ifdef SIMPLE_TASK | |
103 WordCount *w = *(WordCount **)in; | |
104 #else | |
108 WordCount *w = (WordCount *)manager->get_param(0); | 105 WordCount *w = (WordCount *)manager->get_param(0); |
106 #endif | |
109 | 107 |
110 if (w->task_num < w->task_blocks) { | 108 if (w->task_num < w->task_blocks) { |
111 if (w->size >= w->division_size) | 109 if (w->size >= w->division_size) |
112 run_tasks(manager,w,w->task_blocks, w->t_print, w->division_size); | 110 run_tasks(manager,w,w->task_blocks, w->t_print, w->division_size); |
113 while (w->size>0) | 111 while (w->size>0) |
114 run_tasks(manager,w,1, w->t_print, w->size); | 112 run_tasks(manager,w,1, w->t_print, w->size); |
115 // printf("run16 last %d\n",w->task_num); | 113 // printf("run16 last %d\n",w->task_num); |
116 } else { | 114 } else { |
117 | 115 #ifdef SIMPLE_TASK |
116 HTaskPtr t_next = manager->create_task(RUN_TASK_BLOCKS, | |
117 (memaddr)&w->self,sizeof(memaddr),0,0); | |
118 #else | |
118 HTaskPtr t_next = manager->create_task(RUN_TASK_BLOCKS); | 119 HTaskPtr t_next = manager->create_task(RUN_TASK_BLOCKS); |
119 t_next->set_param(0,(void*)w); | 120 t_next->set_param(0,(void*)w); |
121 #endif | |
120 w->t_print->wait_for(t_next); | 122 w->t_print->wait_for(t_next); |
121 | 123 |
122 run_tasks(manager,w, w->task_blocks, t_next, w->division_size); | 124 run_tasks(manager,w, w->task_blocks, t_next, w->division_size); |
123 | 125 |
124 t_next->spawn(); | 126 t_next->spawn(); |
126 } | 128 } |
127 return 0; | 129 return 0; |
128 } | 130 } |
129 | 131 |
130 | 132 |
131 static int blocks = 192; | 133 static int blocks = 48; |
132 static int division = 16; // in Kbyte | 134 static int division = 16; // in Kbyte |
133 | 135 |
134 static void | 136 static void |
135 run_start(TaskManager *manager, char *filename) | 137 run_start(TaskManager *manager, char *filename) |
136 { | 138 { |
139 st_mmap_t st_mmap; | 141 st_mmap_t st_mmap; |
140 st_mmap = my_mmap(filename); | 142 st_mmap = my_mmap(filename); |
141 WordCount *w = (WordCount*)manager->allocate(sizeof(WordCount)); | 143 WordCount *w = (WordCount*)manager->allocate(sizeof(WordCount)); |
142 // bzero(w,sizeof(WordCount)); | 144 // bzero(w,sizeof(WordCount)); |
143 | 145 |
146 w->self = w; | |
144 w->task_blocks = blocks; | 147 w->task_blocks = blocks; |
145 w->task_spwaned = 0; | 148 w->task_spwaned = 0; |
146 | 149 |
147 /*sizeはdivision_sizeの倍数にしている。*/ | 150 /*sizeはdivision_sizeの倍数にしている。*/ |
148 w->size = st_mmap.size; | 151 w->size = st_mmap.size; |
161 w-> status_num = 2; | 164 w-> status_num = 2; |
162 /* taskの数 */ | 165 /* taskの数 */ |
163 w-> task_num = w->size / w->division_size; | 166 w-> task_num = w->size / w->division_size; |
164 int out_task_num = w->task_num + (w->division_size*w->task_num < w->size); | 167 int out_task_num = w->task_num + (w->division_size*w->task_num < w->size); |
165 | 168 |
169 w->out_task_num = out_task_num; | |
166 printf("task_num %d\n",w->task_num); | 170 printf("task_num %d\n",w->task_num); |
167 | 171 |
168 /* out用のdivision_size. statusが2つなので、あわせて16byteになるように、long long(8byte)を使用 */ | 172 /* out用のdivision_size. statusが2つなので、あわせて16byteになるように、long long(8byte)を使用 */ |
173 | |
174 #ifdef SIMPLE_TASK | |
175 w-> division_out_size = sizeof(unsigned long long)*4; | |
176 int out_size = w->division_out_size*out_task_num; | |
177 w->o_data = (unsigned long long *)manager->allocate(out_size); | |
178 w-> out_size = 4; | |
179 #else | |
169 w-> division_out_size = 16; | 180 w-> division_out_size = 16; |
181 int out_size = w->division_out_size*out_task_num; | |
170 /* out用のデータのサイズ。*/ | 182 /* out用のデータのサイズ。*/ |
171 int out_size = w->division_out_size*out_task_num; | 183 caddr_t p = manager->allocate(out_size*2); |
172 w->o_data = (unsigned long long*)manager->allocate(out_size); | 184 w->o_data = (unsigned long long*)p |
173 //bzero(w->o_data,out_size); | 185 //bzero(w->o_data,out_size); |
174 | 186 |
175 w-> pad = 2; | 187 w-> pad = 2; |
176 w->head_tail_flag = (unsigned long long*)manager->allocate(out_size); | 188 w->head_tail_flag = (unsigned long long*)(p+out_size); |
177 // bzero(w->head_tail_flag,out_size); | 189 // bzero(w->head_tail_flag,out_size); |
178 | 190 #endif |
179 printf("out size %d\n",out_size); | 191 printf("out size %d\n",out_size); |
180 | 192 |
181 /*各SPEの結果を合計して出力するタスク*/ | 193 /*各SPEの結果を合計して出力するタスク*/ |
182 | 194 |
195 #ifdef SIMPLE_TASK | |
196 t_print = manager->create_task(TASK_PRINT, | |
197 (memaddr)&w->self,sizeof(memaddr),0,0); | |
198 #else | |
183 t_print = manager->create_task(TASK_PRINT); | 199 t_print = manager->create_task(TASK_PRINT); |
184 t_print->add_inData(w->o_data, out_size); | 200 t_print->add_inData(w->o_data, out_size); |
185 t_print->add_inData(w->head_tail_flag, out_size); | 201 t_print->add_inData(w->head_tail_flag, out_size); |
186 t_print->add_param(out_task_num); | 202 t_print->add_param(out_task_num); |
187 t_print->add_param(w->status_num); | 203 t_print->add_param(w->status_num); |
188 t_print->add_param(out_task_num); | 204 t_print->add_param(out_task_num); |
189 t_print->add_param(w->pad); | 205 t_print->add_param(w->pad); |
206 #endif | |
190 | 207 |
191 w->t_print = t_print; | 208 w->t_print = t_print; |
192 | 209 |
193 /* Task を task_blocks ずつ起動する Task */ | 210 /* Task を task_blocks ずつ起動する Task */ |
194 | 211 #ifdef SIMPLE_TASK |
212 HTaskPtr t_exec = manager->create_task(RUN_TASK_BLOCKS, | |
213 (memaddr)&w->self,sizeof(memaddr),0,0); | |
214 #else | |
195 HTaskPtr t_exec = manager->create_task(RUN_TASK_BLOCKS); | 215 HTaskPtr t_exec = manager->create_task(RUN_TASK_BLOCKS); |
196 t_exec->set_param(0,(void*)w); | 216 t_exec->set_param(0,(void*)w); |
217 #endif | |
197 t_exec->spawn(); | 218 t_exec->spawn(); |
198 | 219 |
199 t_print->wait_for(t_exec); | 220 t_print->wait_for(t_exec); |
200 t_print->spawn(); | 221 t_print->spawn(); |
201 } | 222 } |