Mercurial > hg > Members > kono > Cerium
annotate example/many_task/sort.cc @ 932:f4d7cf77ec3d
sort test (add swap())
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 31 Jul 2010 00:57:46 +0900 |
parents | bde5f13adf10 |
children | da657af64afd |
rev | line source |
---|---|
227 | 1 #include "TaskManager.h" |
573 | 2 #include "SchedTask.h" |
227 | 3 #include "sort.h" |
4 #include "Func.h" | |
5 | |
6 DataPtr data; // sort array | |
7 int data_length; | |
8 static int sort_count; // sort 完了に必要な回数 | |
9 static int split_num; // data の分割数 | |
10 static int half_num; | |
11 static int block_num; // 一つのタスクで sort する data 数 | |
12 static int last_block_num; | |
13 static int half_block_num; | |
14 static int last_half_block_num; | |
15 | |
573 | 16 static void sort_restart(SchedTask *, void *, void *); |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
17 static void sort_start(SchedTask *); |
227 | 18 |
19 /** | |
20 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような | |
21 * len の分割数を返す | |
22 * | |
23 * @param len sort する data の総数 | |
24 * @param num 使用する SPE の数 | |
25 * | |
26 * @return data の分割数 | |
27 * | |
28 * TODO: | |
29 * len が num 以下とか考えてません | |
30 */ | |
31 static int | |
32 get_split_num(int len, int num) | |
33 { | |
34 if (len / num < MAX_BLOCK_SIZE) { | |
35 return num; | |
36 } else { | |
37 // 切り上げ | |
38 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE; | |
39 } | |
40 } | |
41 | |
42 /** | |
43 * btask が全て終了したら、再び sort_start を実行する | |
44 * @param d 生成された btask の数 | |
45 */ | |
46 static void | |
573 | 47 sort_restart(SchedTask *s, void *d, void *e) |
227 | 48 { |
49 static int cnt = 0; | |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
50 // static int ccc = 0; |
625
60aa3f241b10
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
573
diff
changeset
|
51 long max = (long)d; |
227 | 52 |
53 if (++cnt == max) { | |
54 cnt = 0; | |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
55 // printf("restarted %d\n",ccc++); |
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
56 sort_start(s); |
227 | 57 } |
58 } | |
59 | |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
60 #ifdef USE_SIMPLE_TASK |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
61 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
62 static void |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
63 sort_start(SchedTask *manager) |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
64 { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
65 if (--sort_count < 0) { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
66 return; |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
67 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
68 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
69 HTaskPtr fsort[split_num]; |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
70 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
71 for (int i = 0; i < split_num-1; i++) { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
72 fsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
73 (memaddr)&data[i*block_num], sizeof(Data)*block_num, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
74 (memaddr)&data[i*block_num], sizeof(Data)*block_num); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
75 fsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
76 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
77 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
78 // 最後の block は端数なので last_block_num を使う |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
79 { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
80 int i = split_num-1; |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
81 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
82 fsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
83 (memaddr)&data[i*block_num], sizeof(Data)*last_block_num, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
84 (memaddr)&data[i*block_num], sizeof(Data)*last_block_num); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
85 fsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
86 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
87 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
88 if (split_num > 1) { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
89 HTaskPtr bsort[half_num]; |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
90 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
91 for (int i = 0; i < half_num-1; i++) { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
92 bsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
93 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
94 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
95 bsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
96 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
97 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
98 { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
99 int i = half_num-1; |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
100 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
101 bsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
102 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
103 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
104 bsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
105 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
106 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
107 for (int i = 0; i < half_num; i++) { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
108 bsort[i]->wait_for(fsort[i]); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
109 bsort[i]->wait_for(fsort[i+1]); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
110 bsort[i]->set_post(sort_restart, (void*)(half_num),(void*)manager); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
111 bsort[i]->spawn(); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
112 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
113 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
114 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
115 for (int i = 0; i < split_num; i++) { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
116 fsort[i]->spawn(); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
117 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
118 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
119 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
120 #else |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
121 |
227 | 122 static void |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
123 sort_start(SchedTask *manager) |
227 | 124 { |
125 if (--sort_count < 0) { | |
126 return; | |
127 } | |
128 | |
129 HTaskPtr fsort[split_num]; | |
130 | |
131 for (int i = 0; i < split_num-1; i++) { | |
132 fsort[i] = manager->create_task(QUICK_SORT); | |
133 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*block_num); | |
134 fsort[i]->add_outData(&data[i*block_num], sizeof(Data)*block_num); | |
625
60aa3f241b10
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
573
diff
changeset
|
135 fsort[i]->set_param(0,(memaddr)block_num); |
227 | 136 fsort[i]->set_cpu(SPE_ANY); |
137 } | |
138 | |
139 // 最後の block は端数なので last_block_num を使う | |
140 { | |
141 int i = split_num-1; | |
142 | |
143 fsort[i] = manager->create_task(QUICK_SORT); | |
144 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*last_block_num); | |
145 fsort[i]->add_outData(&data[i*block_num], sizeof(Data)*last_block_num); | |
625
60aa3f241b10
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
573
diff
changeset
|
146 fsort[i]->set_param(0,(memaddr)last_block_num); |
227 | 147 fsort[i]->set_cpu(SPE_ANY); |
148 } | |
149 | |
150 if (split_num > 1) { | |
151 HTaskPtr bsort[half_num]; | |
152 | |
153 for (int i = 0; i < half_num-1; i++) { | |
154 bsort[i] = manager->create_task(QUICK_SORT); | |
155 bsort[i]->add_inData(&data[i*block_num+half_block_num], | |
156 sizeof(Data)*block_num); | |
157 bsort[i]->add_outData(&data[i*block_num+half_block_num], | |
158 sizeof(Data)*block_num); | |
625
60aa3f241b10
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
573
diff
changeset
|
159 bsort[i]->set_param(0,(memaddr)block_num); |
227 | 160 bsort[i]->set_cpu(SPE_ANY); |
161 } | |
162 | |
163 { | |
164 int i = half_num-1; | |
165 | |
166 bsort[i] = manager->create_task(QUICK_SORT); | |
167 bsort[i]->add_inData(&data[i*block_num+half_block_num], | |
168 sizeof(Data)*last_half_block_num); | |
169 bsort[i]->add_outData(&data[i*block_num+half_block_num], | |
170 sizeof(Data)*last_half_block_num); | |
625
60aa3f241b10
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
573
diff
changeset
|
171 bsort[i]->set_param(0,(memaddr)last_half_block_num); |
227 | 172 bsort[i]->set_cpu(SPE_ANY); |
173 } | |
174 | |
175 for (int i = 0; i < half_num; i++) { | |
176 bsort[i]->wait_for(fsort[i]); | |
177 bsort[i]->wait_for(fsort[i+1]); | |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
178 bsort[i]->set_post(sort_restart, (void*)(half_num),(void*)manager); |
227 | 179 bsort[i]->spawn(); |
180 } | |
181 } | |
182 | |
183 for (int i = 0; i < split_num; i++) { | |
184 fsort[i]->spawn(); | |
185 } | |
186 } | |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
187 #endif |
227 | 188 |
189 void | |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
190 sort_init(SchedTask *manager, void *a, void *b) |
227 | 191 { |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
192 int cpuNum = (int)a; |
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
193 int length = (int)b; |
400 | 194 |
227 | 195 data = (DataPtr)manager->allocate(sizeof(Data)*length); |
196 data_length = length; | |
197 | |
198 for (int i = 0; i < length; i++) { | |
230 | 199 data[i].index = manager->get_random()%10000; |
227 | 200 data[i].ptr = 0; |
201 } | |
202 | |
203 split_num = get_split_num(length, cpuNum); | |
204 half_num = split_num-1; | |
205 sort_count = split_num; | |
206 | |
207 block_num = (length + split_num -1)/split_num; | |
208 half_block_num = block_num/2; | |
209 | |
210 last_block_num = length - (split_num-1)*block_num; | |
211 last_half_block_num = half_block_num+(last_block_num/2); | |
212 | |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
213 sort_start(manager); |
227 | 214 } |
400 | 215 |
651 | 216 /* end */ |