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 }