Mercurial > hg > Members > kono > Cerium
annotate example/many_task/sort.cc @ 935:e54842e4d97b
-a option for sort
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 31 Jul 2010 03:13:24 +0900 |
parents | da657af64afd |
children | 14fb1c888931 |
rev | line source |
---|---|
227 | 1 #include "TaskManager.h" |
573 | 2 #include "SchedTask.h" |
227 | 3 #include "sort.h" |
4 #include "Func.h" | |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
5 #include <string.h> |
227 | 6 |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
7 static void sort_start(SchedTask *); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
8 extern void check_data(); |
227 | 9 |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
10 static DataPtr data; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
11 static int data_length; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
12 static int cpuNum; |
227 | 13 |
935 | 14 extern int all; |
15 | |
227 | 16 /** |
17 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような | |
18 * len の分割数を返す | |
19 * | |
20 * @param len sort する data の総数 | |
21 * @param num 使用する SPE の数 | |
22 * | |
23 * @return data の分割数 | |
24 * | |
25 * TODO: | |
26 * len が num 以下とか考えてません | |
27 */ | |
28 static int | |
29 get_split_num(int len, int num) | |
30 { | |
31 if (len / num < MAX_BLOCK_SIZE) { | |
32 return num; | |
33 } else { | |
34 // 切り上げ | |
35 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE; | |
36 } | |
37 } | |
38 | |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
39 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
40 HTaskPtr *fsort; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
41 HTaskPtr *bsort; |
935 | 42 int split_num; |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
43 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
44 |
227 | 45 /** |
46 * btask が全て終了したら、再び sort_start を実行する | |
47 * @param d 生成された btask の数 | |
48 */ | |
935 | 49 |
50 SchedDefineTask1(RESTART, sort_restart ); | |
51 | |
52 static int | |
573 | 53 sort_restart(SchedTask *s, void *d, void *e) |
227 | 54 { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
55 static int ccc = 0; |
227 | 56 |
935 | 57 printf("restarted %d %% %d\n",ccc++,split_num); |
58 sort_start(s); | |
59 return 0; | |
227 | 60 } |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
61 #ifdef USE_SIMPLE_TASK |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
62 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
63 static void |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
64 sort_start(SchedTask *manager) |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
65 { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
66 int half_num = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
67 static int sort_count = split_num; // sort 完了に必要な回数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
68 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
69 // 一つのタスクで sort する data 数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
70 int block_num = (data_length + split_num -1)/split_num; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
71 int half_block_num = block_num/2; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
72 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
73 int last_block_num = data_length - (split_num-1)*block_num; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
74 int last_half_block_num = half_block_num+(last_block_num/2); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
75 |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
76 if (--sort_count < 0) { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
77 check_data(); |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
78 return; |
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 |
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 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
|
83 fsort[i] = manager->create_task(QUICK_SORT, |
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)*block_num, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
85 (memaddr)&data[i*block_num], sizeof(Data)*block_num); |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
86 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
87 fsort[i]->wait_for(bsort[i-1]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
88 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
89 if (i<split_num-2 && bsort[i]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
90 fsort[i]->wait_for(bsort[i]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
91 } |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
92 fsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
93 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
94 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
95 // 最後の block は端数なので last_block_num を使う |
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 int i = split_num-1; |
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 fsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
100 (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
|
101 (memaddr)&data[i*block_num], sizeof(Data)*last_block_num); |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
102 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
103 fsort[i]->wait_for(bsort[i-1]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
104 } |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
105 fsort[i]->set_cpu(SPE_ANY); |
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 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
108 if (split_num > 1) { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
109 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
110 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
|
111 bsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
112 (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
|
113 (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
|
114 bsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
115 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
116 |
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 int i = half_num-1; |
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 bsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
121 (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
|
122 (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
|
123 bsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
124 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
125 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
126 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
|
127 bsort[i]->wait_for(fsort[i]); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
128 bsort[i]->wait_for(fsort[i+1]); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
129 bsort[i]->spawn(); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
130 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
131 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
132 |
935 | 133 HTaskPtr restart = manager->create_task(RESTART,0,0,0,0); |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
134 for (int i = 0; i < split_num; i++) { |
935 | 135 if (!all) restart->wait_for(fsort[i]); |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
136 fsort[i]->spawn(); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
137 } |
935 | 138 restart->spawn(); |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
139 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
140 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
141 #else |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
142 |
227 | 143 static void |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
144 sort_start(SchedTask *manager) |
227 | 145 { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
146 int half_num = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
147 static int sort_count = split_num; // sort 完了に必要な回数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
148 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
149 // 一つのタスクで sort する data 数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
150 int block_num = (data_length + split_num -1)/split_num; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
151 int half_block_num = block_num/2; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
152 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
153 int last_block_num = data_length - (split_num-1)*block_num; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
154 int last_half_block_num = half_block_num+(last_block_num/2); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
155 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
156 |
227 | 157 if (--sort_count < 0) { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
158 check_data(); |
227 | 159 return; |
160 } | |
161 | |
162 | |
163 for (int i = 0; i < split_num-1; i++) { | |
164 fsort[i] = manager->create_task(QUICK_SORT); | |
165 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*block_num); | |
166 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
|
167 fsort[i]->set_param(0,(memaddr)block_num); |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
168 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
169 fsort[i]->wait_for(bsort[i-1]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
170 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
171 if (i<split_num-2 && bsort[i]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
172 fsort[i]->wait_for(bsort[i]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
173 } |
227 | 174 fsort[i]->set_cpu(SPE_ANY); |
175 } | |
176 | |
177 // 最後の block は端数なので last_block_num を使う | |
178 { | |
179 int i = split_num-1; | |
180 | |
181 fsort[i] = manager->create_task(QUICK_SORT); | |
182 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*last_block_num); | |
183 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
|
184 fsort[i]->set_param(0,(memaddr)last_block_num); |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
185 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
186 fsort[i]->wait_for(bsort[i-1]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
187 } |
227 | 188 fsort[i]->set_cpu(SPE_ANY); |
189 } | |
190 | |
191 if (split_num > 1) { | |
192 HTaskPtr bsort[half_num]; | |
193 | |
194 for (int i = 0; i < half_num-1; i++) { | |
195 bsort[i] = manager->create_task(QUICK_SORT); | |
196 bsort[i]->add_inData(&data[i*block_num+half_block_num], | |
197 sizeof(Data)*block_num); | |
198 bsort[i]->add_outData(&data[i*block_num+half_block_num], | |
199 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
|
200 bsort[i]->set_param(0,(memaddr)block_num); |
227 | 201 bsort[i]->set_cpu(SPE_ANY); |
202 } | |
203 | |
204 { | |
205 int i = half_num-1; | |
206 | |
207 bsort[i] = manager->create_task(QUICK_SORT); | |
208 bsort[i]->add_inData(&data[i*block_num+half_block_num], | |
209 sizeof(Data)*last_half_block_num); | |
210 bsort[i]->add_outData(&data[i*block_num+half_block_num], | |
211 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
|
212 bsort[i]->set_param(0,(memaddr)last_half_block_num); |
227 | 213 bsort[i]->set_cpu(SPE_ANY); |
214 } | |
215 | |
216 for (int i = 0; i < half_num; i++) { | |
217 bsort[i]->wait_for(fsort[i]); | |
218 bsort[i]->wait_for(fsort[i+1]); | |
219 bsort[i]->spawn(); | |
220 } | |
221 } | |
222 | |
935 | 223 HTask restart = create_task(RESTART,0,0,0,0); |
227 | 224 for (int i = 0; i < split_num; i++) { |
935 | 225 if (!all) restart->wait_for(fsort[i]); |
227 | 226 fsort[i]->spawn(); |
227 } | |
935 | 228 restart->spawn(); |
229 | |
227 | 230 } |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
231 #endif |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
232 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
233 void check_data() |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
234 { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
235 int flag = 1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
236 for(int i=0; i< data_length-1;i++) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
237 if (data[i].index>data[i+1].index) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
238 printf("Data are not sorted at %d. %d > %d \n",i, data[i].index,data[i+1].index); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
239 flag = 0; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
240 break; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
241 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
242 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
243 if (flag) printf("Data are sorted\n"); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
244 } |
227 | 245 |
935 | 246 |
227 | 247 void |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
248 sort_init(SchedTask *manager, void *a, void *b) |
227 | 249 { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
250 cpuNum = (int)a; |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
251 int length = (int)b; |
400 | 252 |
227 | 253 data = (DataPtr)manager->allocate(sizeof(Data)*length); |
254 data_length = length; | |
255 | |
935 | 256 split_num = get_split_num(data_length, cpuNum); // data の分割数 |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
257 int half_num = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
258 fsort = (HTaskPtr*)manager->allocate(sizeof(HTaskPtr)*split_num); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
259 bsort = (HTaskPtr*)manager->allocate(sizeof(HTaskPtr)*half_num); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
260 memset((void*)bsort,0, sizeof(HTaskPtr)*half_num); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
261 |
227 | 262 for (int i = 0; i < length; i++) { |
230 | 263 data[i].index = manager->get_random()%10000; |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
264 data[i].ptr = i; |
227 | 265 } |
266 | |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
267 sort_start(manager); |
227 | 268 } |
400 | 269 |
651 | 270 /* end */ |