Mercurial > hg > Members > kono > Cerium
annotate example/many_task/sort.cc @ 941:0c11c2fd7e63
add no_auto_free flag on HTask
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 31 Jul 2010 17:50:38 +0900 |
parents | 0d404f6c36a8 |
children | a9c7784e5dae |
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 extern void check_data(); |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
8 extern int all; // allocate task at once |
227 | 9 |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
10 static void sort_start(SchedTask *); |
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
11 static int data_length; |
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
12 static int cpuNum; |
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
13 static int split_num; |
935 | 14 |
227 | 15 /** |
16 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような | |
17 * len の分割数を返す | |
18 * | |
19 * @param len sort する data の総数 | |
20 * @param num 使用する SPE の数 | |
21 * | |
22 * @return data の分割数 | |
23 * | |
24 * TODO: | |
25 * len が num 以下とか考えてません | |
26 */ | |
27 static int | |
28 get_split_num(int len, int num) | |
29 { | |
30 if (len / num < MAX_BLOCK_SIZE) { | |
31 return num; | |
32 } else { | |
33 // 切り上げ | |
34 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE; | |
35 } | |
36 } | |
37 | |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
38 |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
39 static HTaskPtr *fsort; |
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
40 static HTaskPtr *bsort; |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
41 |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
42 static DataPtr data; |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
43 |
227 | 44 /** |
45 * btask が全て終了したら、再び sort_start を実行する | |
46 * @param d 生成された btask の数 | |
47 */ | |
935 | 48 |
49 SchedDefineTask1(RESTART, sort_restart ); | |
50 | |
51 static int | |
573 | 52 sort_restart(SchedTask *s, void *d, void *e) |
227 | 53 { |
939 | 54 // static int ccc = 0; |
227 | 55 |
938
8733ad41297d
dead lock still remains. zombi problem?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
56 // printf("restarted %d %% %d\n",ccc++,split_num); |
935 | 57 sort_start(s); |
58 return 0; | |
227 | 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 { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
65 int half_num = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
66 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
|
67 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
68 // 一つのタスクで sort する data 数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
69 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
|
70 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
|
71 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
72 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
|
73 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
|
74 |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
75 if (--sort_count < 0) { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
76 return; |
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 |
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 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
|
81 fsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
82 (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
|
83 (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
|
84 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
85 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
|
86 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
87 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
|
88 fsort[i]->wait_for(bsort[i]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
89 } |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
90 fsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
91 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
92 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
93 // 最後の block は端数なので last_block_num を使う |
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 int i = split_num-1; |
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 fsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
98 (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
|
99 (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
|
100 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
101 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
|
102 } |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
103 fsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
104 } |
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 if (split_num > 1) { |
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 for (int i = 0; i < half_num-1; i++) { |
941
0c11c2fd7e63
add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
940
diff
changeset
|
109 if (bsort[i]) manager->free_htask(bsort[i]); |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
110 bsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
111 (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
|
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 bsort[i]->set_cpu(SPE_ANY); |
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 |
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 int i = half_num-1; |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
118 |
941
0c11c2fd7e63
add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
940
diff
changeset
|
119 if (bsort[i]) manager->free_htask(bsort[i]); |
932
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]); |
941
0c11c2fd7e63
add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
940
diff
changeset
|
129 bsort[i]->no_auto_free(); |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
130 bsort[i]->spawn(); |
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 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
133 |
935 | 134 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
|
135 for (int i = 0; i < split_num; i++) { |
935 | 136 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
|
137 fsort[i]->spawn(); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
138 } |
935 | 139 restart->spawn(); |
932
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 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
142 #else |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
143 |
227 | 144 static void |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
145 sort_start(SchedTask *manager) |
227 | 146 { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
147 int half_num = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
148 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
|
149 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
150 // 一つのタスクで sort する data 数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
151 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
|
152 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
|
153 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
154 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
|
155 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
|
156 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
157 |
227 | 158 if (--sort_count < 0) { |
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 | |
193 for (int i = 0; i < half_num-1; i++) { | |
941
0c11c2fd7e63
add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
940
diff
changeset
|
194 if (bsort[i]) manager->free_htask(bsort[i]); |
227 | 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 | |
941
0c11c2fd7e63
add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
940
diff
changeset
|
207 if (bsort[i]) manager->free_htask(bsort[i]); |
227 | 208 bsort[i] = manager->create_task(QUICK_SORT); |
209 bsort[i]->add_inData(&data[i*block_num+half_block_num], | |
210 sizeof(Data)*last_half_block_num); | |
211 bsort[i]->add_outData(&data[i*block_num+half_block_num], | |
212 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
|
213 bsort[i]->set_param(0,(memaddr)last_half_block_num); |
227 | 214 bsort[i]->set_cpu(SPE_ANY); |
215 } | |
216 | |
217 for (int i = 0; i < half_num; i++) { | |
218 bsort[i]->wait_for(fsort[i]); | |
219 bsort[i]->wait_for(fsort[i+1]); | |
941
0c11c2fd7e63
add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
940
diff
changeset
|
220 bsort[i]->no_auto_free(); |
227 | 221 bsort[i]->spawn(); |
222 } | |
223 } | |
224 | |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
225 HTaskPtr restart = manager->create_task(RESTART,0,0,0,0); |
227 | 226 for (int i = 0; i < split_num; i++) { |
935 | 227 if (!all) restart->wait_for(fsort[i]); |
227 | 228 fsort[i]->spawn(); |
229 } | |
935 | 230 restart->spawn(); |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
231 } |
935 | 232 |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
233 #endif |
934
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 void check_data() |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
236 { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
237 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
|
238 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
|
239 printf("Data are not sorted at %d. %d > %d \n",i, data[i].index,data[i+1].index); |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
240 return; |
934
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 } |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
243 printf("Data are sorted\n"); |
934
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 */ |