diff example/word_count/main.cc @ 970:33630c6ff445

change pipeline and TaskArray fast
author Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
date Thu, 26 Aug 2010 20:38:06 +0900
parents 0a6c5ee89a4c
children d093d601fc14
line wrap: on
line diff
--- a/example/word_count/main.cc	Mon Aug 09 00:09:00 2010 +0900
+++ b/example/word_count/main.cc	Thu Aug 26 20:38:06 2010 +0900
@@ -17,6 +17,7 @@
 int use_task_array = 1;
 int use_compat = 0;
 int array_task_num = 8;
+int spe_num = 1;
 
 const char *usr_help_str = "Usage: ./word_count [-a -c -s] [-cpu spe_num] [-file filename]\n";
 
@@ -82,58 +83,105 @@
     if (task_count<=0) return;
   }
   
+
+  if (use_task_array) {
+
+    int spl = spe_num * array_task_num;
+    int loop = (task_count + spl - 1) / spl;
+
+    for (int i = 0; i < loop; i += 1) {
+      
+      if (spl > w->task_num) {
+	spe_num = 1;
+	array_task_num = w->task_num;
+      }
+      
+      
+      HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num);
+      Task **t_exec = (Task**)manager->allocate(sizeof(Task*)*spe_num);
+    
+      for (int k = 0; k < spe_num; k++) {
+	task_array[k] = manager->create_task_array(TASK_EXEC,array_task_num,0,1,1);
+	t_exec[k] = 0;
+	if (all) {
+	  w->t_print->wait_for(task_array[k]);
+	} else {
+	  t_next->wait_for(task_array[k]);
+	}
+      }	
+      
+      
+      for (int j = 0; j < array_task_num; j++) {
+	for (int k = 0; k < spe_num; k++) {
+	  
+	  int a = w->task_spwaned++;
+	  
+	  if (w->size < size) size = w->size;
+	  
+	  t_exec[k] = task_array[k]->next_task_array(TASK_EXEC,t_exec[k]);
+	  t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size);
+	  t_exec[k]->set_outData(0,w->o_data + a*w->out_size, w->division_out_size);
+	  
+	  w->size -= size;
+	  w->task_num--;
+	}
+      }
+      
+      for (int k = 0; k < spe_num; k++) {
+	task_array[k]->spawn_task_array(t_exec[k]->next());
+	task_array[k]->set_cpu(SPE_ANY);
+	task_array[k]->spawn();
+      }	
+      
+    }
+
+    return;
+
+  }
+  
+  
   for (int i = 0; i < task_count; i += array_task_num) {
-        
-    HTask *task_array;
-    if (use_task_array) {
-	int task_num = (w->size+size-1)/size;
-	if (task_num>array_task_num) task_num = array_task_num;
-	task_array = manager->create_task_array(TASK_EXEC,task_num,0,1,1);
-	if (!all) { 
-	    t_next->wait_for(task_array);
-	} else {
-	    w->t_print->wait_for(task_array);
-	}
-    }
-    
-    Task *t_exec = 0;
-    HTask *h_exec = 0;
+
+  HTask *h_exec = 0;
     for (int j = 0; j < array_task_num; j++) {
 	int i = w->task_spwaned++;
 	if (w->size < size) size = w->size;
 	if (size==0) break;
-	if (use_task_array) {
-	    t_exec = task_array->next_task_array(TASK_EXEC,t_exec);
-	    t_exec->set_inData(0,w->file_mmap + i*w->division_size, size);
-	    t_exec->set_outData(0,w->o_data + i*w->out_size, w->division_out_size);
-	} else if (use_compat) {
+
+	if (use_compat) {
 	    h_exec = manager->create_task(TASK_EXEC);
 	    h_exec->set_inData(0,w->file_mmap + i*w->division_size, size);
 	    h_exec->set_outData(0,w->o_data + i*w->out_size, w->division_out_size);
 
-	    t_next->wait_for(h_exec);
-
+	    if (all) {
+	      w->t_print->wait_for(h_exec);
+	    } else {
+	      t_next->wait_for(h_exec);
+	    }
+	    
 	    h_exec->set_cpu(SPE_ANY);
 	    h_exec->spawn();
+
 	} else {
 	    h_exec = manager->create_task(TASK_EXEC,
 		(memaddr)(w->file_mmap + i*w->division_size), size,
 		(memaddr)(w->o_data + i*w->out_size), w->division_out_size);
-	    t_next->wait_for(h_exec);
+
+	    if (all) {
+	      w->t_print->wait_for(h_exec);
+	    } else {
+	      t_next->wait_for(h_exec);
+	    }
+
 	    h_exec->set_cpu(SPE_ANY);
 	    h_exec->spawn();
 	}
 	w->size -= size;
 	w->task_num--;
     }
-    if (use_task_array) {
-	task_array->spawn_task_array(t_exec->next());
-	task_array->set_cpu(SPE_ANY);
-	task_array->spawn();
-    } else {
-      //if (!all) t_next->wait_for(h_exec);
-    }
-  } 
+
+  }
+
 }
 
 /**
@@ -269,6 +317,8 @@
 	    use_compat = 0;
 	} else if (strcmp(argv[i], "-anum") == 0) {
 	    array_task_num = atoi(argv[i+1]);
+	} else if (strcmp(argv[i], "-cpu") == 0) {
+	    spe_num = atoi(argv[i+1]);
 	}
     }
     if (filename==0) {