comparison example/regex_mas/main.cc @ 1676:342c36d5582e draft

fix bug
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Tue, 23 Jul 2013 17:02:07 +0900
parents 99f8130793b4
children e44e5a18392c
comparison
equal deleted inserted replaced
1675:07ff7ec2a61b 1676:342c36d5582e
10 #include "TaskManager.h" 10 #include "TaskManager.h"
11 #include "SchedTask.h" 11 #include "SchedTask.h"
12 #include "Func.h" 12 #include "Func.h"
13 #include "WordCount.h" 13 #include "WordCount.h"
14 14
15 #define EXTRA_LENGTH 4 //多く取ってくる文字数(search word length - 1) 15 #define EXTRA_LENGTH 2 //多く取ってくる文字数(search word length - 1)
16 16
17 /* ;TODO 17 /* ;TODO
18 * PS3でCPU数が2以上の時に、あまりが計算されてない 18 * PS3でCPU数が2以上の時に、あまりが計算されてない
19 */ 19 */
20 20
206 int spl = spe_num * array_task_num; 206 int spl = spe_num * array_task_num;
207 int loop = (task_count + spl - 1) / spl; 207 int loop = (task_count + spl - 1) / spl;
208 208
209 for (int i = 0; i < loop; i += 1) { 209 for (int i = 0; i < loop; i += 1) {
210 210
211 if (spl > w->task_num) { 211 if (w->task_num < spe_num) spe_num = w->task_num;
212 if (w->task_num >= spe_num) {
213 array_task_num = w->task_num / spe_num;
214 } else {
215
216 int task_num = w->task_num;
217
218 for (int j = 0; j < task_num; j++) {
219 HTask *h_exec = 0;
220 int i = w->task_spwaned++;
221
222 if (w->size < size) size = w->size;
223
224 h_exec = manager->create_task(TASK_EXEC,
225 (memaddr)(w->file_mmap + i*w->division_size), size,
226 (memaddr)(w->o_data + i*w->out_size), w->division_out_size);
227
228 if (all) {
229 w->t_print->wait_for(h_exec);
230 } else {
231 t_next->wait_for(h_exec);
232 }
233
234 h_exec->set_cpu(spe_cpu);
235 h_exec->spawn();
236
237 w->size -= size;
238 if (w->size == 0) break;
239 w->task_num--;
240
241 }
242
243 return;
244 }
245 }
246 212
247 // ここから 213 // ここから
248 HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num); 214 HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num);
249 Task **t_exec = (Task**)manager->allocate(sizeof(Task*)*spe_num); 215 Task **t_exec = (Task**)manager->allocate(sizeof(Task*)*spe_num);
250 216
271 const int ONE_LOOP_LENGTH = array_task_num*spe_num*ONE_TASK_LENGTH; 237 const int ONE_LOOP_LENGTH = array_task_num*spe_num*ONE_TASK_LENGTH;
272 const int ARRAY_LENGTH_SIZE = spe_num * ONE_TASK_LENGTH; 238 const int ARRAY_LENGTH_SIZE = spe_num * ONE_TASK_LENGTH;
273 int offset = ONE_LOOP_LENGTH * i + ARRAY_LENGTH_SIZE*j + ONE_TASK_LENGTH*k; 239 int offset = ONE_LOOP_LENGTH * i + ARRAY_LENGTH_SIZE*j + ONE_TASK_LENGTH*k;
274 t_exec[k]->set_param(0,(memaddr)length); 240 t_exec[k]->set_param(0,(memaddr)length);
275 t_exec[k]->set_param(1,(memaddr)offset); 241 t_exec[k]->set_param(1,(memaddr)offset);
276 //printf("%s\n",search_word);
277 if(size != w->size){ //ラストのタスクかどうかの判定 242 if(size != w->size){ //ラストのタスクかどうかの判定
278 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size+EXTRA_LENGTH); 243 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size+EXTRA_LENGTH);
279 }else{ 244 }else{
280 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size); 245 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size);
281 } 246 }