comparison example/many_task/main.cc @ 0:04e28d8d3c6f

first commit
author Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
date Mon, 08 Nov 2010 01:23:25 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:04e28d8d3c6f
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <sys/time.h>
5 #include "TaskManager.h"
6 #include "SchedTask.h"
7
8 #include "Func.h"
9 #include "sort.h"
10
11 extern void task_init();
12 extern int get_split_num(int len, int num);
13
14
15 // sort.cc
16 extern int data_length;
17 extern DataPtr data;
18 extern int all;
19 int all = 0;
20
21 static int sort_task = SortSimple;
22
23 // 計測用
24 static double st_time;
25 static double ed_time;
26
27 static int length = 1200;
28
29 // prototype
30 void TMend(TaskManager *);
31
32 static double
33 getTime()
34 {
35 struct timeval tv;
36 gettimeofday(&tv, NULL);
37 return tv.tv_sec + (double)tv.tv_usec*1e-6;
38 }
39 /*
40 static void
41 show_data(void)
42 {
43 puts("-----------------------------------------------");
44 for(int i = 0; i < data_length; i++) {
45 printf("data[%02d].index = %d\n", i, data[i].index);
46 }
47 puts("-----------------------------------------------");
48 }
49 */
50
51 const char *usr_help_str = "Usage: ./sort [option]\n \
52 options\n\
53 -cpu Number of SPE used (default 1)\n\
54 -l, --length Sorted number of data (default 1200)\n\
55 -h, --help Print this message";
56
57 int
58 init(int argc, char **argv)
59 {
60 for (int i = 1; argv[i]; ++i) {
61 if (strcmp(argv[i], "--length") == 0 || strcmp(argv[i], "-l") == 0) {
62 length = atoi(argv[++i]);
63 }
64 if (strcmp(argv[i], "-a") == 0 ) {
65 all = 1;
66 }
67 if (strcmp(argv[i], "-c") == 0 ) {
68 sort_task = SortCompat;
69 }
70 if (strcmp(argv[i], "-s") == 0 ) {
71 sort_task = SortSimple;
72 }
73
74 }
75
76 return 0;
77 }
78
79 Sort sorter;
80
81 static void
82 check_data()
83 {
84 for(int i=0; i< sorter.data_length-1;i++) {
85 if (sorter.data[i].index>sorter.data[i+1].index) {
86 printf("Data are not sorted at %d. %d > %d \n",i, sorter.data[i].index,sorter.data[i+1].index);
87 return;
88 }
89 }
90 printf("Data are sorted\n");
91 }
92
93
94 static void
95 sort_init(SchedTask *manager, void *a, void *b)
96 {
97 sorter.cpuNum = (int)a;
98 int length = (int)b;
99
100 sorter.data = (DataPtr)manager->allocate(sizeof(Data)*length);
101 sorter.data_length = length;
102
103 sorter.split_num = get_split_num(sorter.data_length, sorter.cpuNum); // data の分割数
104 int half_num = sorter.split_num-1;
105 sorter.fsort = (HTaskPtr*)manager->allocate(sizeof(HTaskPtr)*sorter.split_num);
106 sorter.bsort = (HTaskPtr*)manager->allocate(sizeof(HTaskPtr)*half_num);
107 memset((void*)sorter.bsort,0, sizeof(HTaskPtr)*half_num);
108
109 for (int i = 0; i < length; i++) {
110 sorter.data[i].index = manager->get_random()%10000;
111 sorter.data[i].ptr = i;
112 }
113
114 HTaskPtr restart = manager->create_task(sort_task,0,0,0,0);
115 restart->set_param(0,(memaddr)&sorter);
116 restart->spawn();
117 }
118
119 unsigned int ts, te;
120
121 int
122 TMmain(TaskManager *manager, int argc, char *argv[])
123 {
124 if (init(argc, argv) < 0) {
125 return -1;
126 }
127
128 task_init();
129
130 int cpu = manager->get_cpuNum();
131
132 // in case of -cpu 0
133 if (cpu==0) cpu = 1;
134 if (1) {
135 HTask *dummy = manager->create_task(Dummy);
136 dummy->set_post(sort_init, (void*)cpu, (void*)length);
137 dummy->spawn();
138 } else {
139 sort_init(manager->get_schedTask(),(void*)cpu, (void*)length);
140 }
141
142 st_time = getTime();
143
144 // 全ての Task が終了した後に実行する関数をセット
145 manager->set_TMend(TMend);
146
147 return 0;
148 }
149
150 void
151 TMend(TaskManager *manager)
152 {
153 ed_time = getTime();
154 //show_data();
155 check_data();
156 printf("Time: %0.6f\n",ed_time-st_time);
157 }
158
159 /* end */