Mercurial > hg > Members > kono > Cerium
annotate example/many_task/sort.cc @ 934:da657af64afd
sort fix ( not working now )
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 31 Jul 2010 02:45:21 +0900 |
parents | f4d7cf77ec3d |
children | e54842e4d97b |
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 |
14 /** | |
15 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような | |
16 * len の分割数を返す | |
17 * | |
18 * @param len sort する data の総数 | |
19 * @param num 使用する SPE の数 | |
20 * | |
21 * @return data の分割数 | |
22 * | |
23 * TODO: | |
24 * len が num 以下とか考えてません | |
25 */ | |
26 static int | |
27 get_split_num(int len, int num) | |
28 { | |
29 if (len / num < MAX_BLOCK_SIZE) { | |
30 return num; | |
31 } else { | |
32 // 切り上げ | |
33 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE; | |
34 } | |
35 } | |
36 | |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
37 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
38 HTaskPtr *fsort; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
39 HTaskPtr *bsort; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
40 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
41 #define ALL_TASK |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
42 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
43 #ifdef ALL_TASK |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
44 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
45 static void |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
46 sort_start(SchedTask *manager) |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
47 { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
48 int split_num = get_split_num(data_length, cpuNum); // data の分割数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
49 int half_num = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
50 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
|
51 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
52 // 一つのタスクで sort する data 数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
53 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
|
54 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
|
55 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
56 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
|
57 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
|
58 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
59 while (--sort_count > 0) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
60 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
61 for (int i = 0; i < split_num-1; i++) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
62 fsort[i] = manager->create_task(QUICK_SORT, |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
63 (memaddr)&data[i*block_num], sizeof(Data)*block_num, |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
64 (memaddr)&data[i*block_num], sizeof(Data)*block_num); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
65 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
66 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
|
67 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
68 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
|
69 fsort[i]->wait_for(bsort[i]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
70 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
71 fsort[i]->set_cpu(SPE_ANY); |
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 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
74 // 最後の block は端数なので last_block_num を使う |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
75 { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
76 int i = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
77 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
78 fsort[i] = manager->create_task(QUICK_SORT, |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
79 (memaddr)&data[i*block_num], sizeof(Data)*last_block_num, |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
80 (memaddr)&data[i*block_num], sizeof(Data)*last_block_num); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
81 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
82 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
|
83 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
84 fsort[i]->set_cpu(SPE_ANY); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
85 } |
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 (split_num > 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 for (int i = 0; i < half_num-1; i++) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
90 bsort[i] = manager->create_task(QUICK_SORT, |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
91 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num, |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
92 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
93 bsort[i]->set_cpu(SPE_ANY); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
94 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
95 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
96 { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
97 int i = half_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
98 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
99 bsort[i] = manager->create_task(QUICK_SORT, |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
100 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num, |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
101 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
102 bsort[i]->set_cpu(SPE_ANY); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
103 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
104 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
105 for (int i = 0; i < half_num; i++) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
106 bsort[i]->wait_for(fsort[i]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
107 bsort[i]->wait_for(fsort[i+1]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
108 bsort[i]->spawn(); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
109 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
110 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
111 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
112 for (int i = 0; i < split_num; i++) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
113 fsort[i]->spawn(); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
114 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
115 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
116 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
117 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
118 #else |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
119 |
227 | 120 /** |
121 * btask が全て終了したら、再び sort_start を実行する | |
122 * @param d 生成された btask の数 | |
123 */ | |
124 static void | |
573 | 125 sort_restart(SchedTask *s, void *d, void *e) |
227 | 126 { |
127 static int cnt = 0; | |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
128 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
|
129 long max = (long)d; |
227 | 130 |
131 if (++cnt == max) { | |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
132 printf("restarted %d %% %ld\n",ccc++,max); |
227 | 133 cnt = 0; |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
134 sort_start(s); |
227 | 135 } |
136 } | |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
137 #ifdef USE_SIMPLE_TASK |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
138 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
139 static void |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
140 sort_start(SchedTask *manager) |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
141 { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
142 int split_num = get_split_num(data_length, cpuNum); // data の分割数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
143 int half_num = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
144 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
|
145 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
146 // 一つのタスクで sort する data 数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
147 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
|
148 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
|
149 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
150 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
|
151 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
|
152 |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
153 if (--sort_count < 0) { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
154 check_data(); |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
155 return; |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
156 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
157 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
158 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
159 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
|
160 fsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
161 (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
|
162 (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
|
163 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
164 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
|
165 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
166 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
|
167 fsort[i]->wait_for(bsort[i]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
168 } |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
169 fsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
170 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
171 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
172 // 最後の block は端数なので last_block_num を使う |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
173 { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
174 int i = split_num-1; |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
175 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
176 fsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
177 (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
|
178 (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
|
179 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
180 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
|
181 } |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
182 fsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
183 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
184 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
185 if (split_num > 1) { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
186 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
187 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
|
188 bsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
189 (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
|
190 (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
|
191 bsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
192 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
193 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
194 { |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
195 int i = half_num-1; |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
196 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
197 bsort[i] = manager->create_task(QUICK_SORT, |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
198 (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
|
199 (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
|
200 bsort[i]->set_cpu(SPE_ANY); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
201 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
202 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
203 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
|
204 bsort[i]->wait_for(fsort[i]); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
205 bsort[i]->wait_for(fsort[i+1]); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
206 bsort[i]->spawn(); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
207 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
208 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
209 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
210 for (int i = 0; i < split_num; i++) { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
211 fsort[i]->set_post(sort_restart, (void*)(half_num),(void*)manager); |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
212 fsort[i]->spawn(); |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
213 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
214 } |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
215 |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
216 #else |
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
217 |
227 | 218 static void |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
219 sort_start(SchedTask *manager) |
227 | 220 { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
221 int split_num = get_split_num(data_length, cpuNum); // data の分割数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
222 int half_num = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
223 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
|
224 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
225 // 一つのタスクで sort する data 数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
226 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
|
227 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
|
228 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
229 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
|
230 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
|
231 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
232 |
227 | 233 if (--sort_count < 0) { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
234 check_data(); |
227 | 235 return; |
236 } | |
237 | |
238 | |
239 for (int i = 0; i < split_num-1; i++) { | |
240 fsort[i] = manager->create_task(QUICK_SORT); | |
241 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*block_num); | |
242 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
|
243 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
|
244 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
245 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
|
246 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
247 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
|
248 fsort[i]->wait_for(bsort[i]); |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
249 } |
227 | 250 fsort[i]->set_cpu(SPE_ANY); |
251 } | |
252 | |
253 // 最後の block は端数なので last_block_num を使う | |
254 { | |
255 int i = split_num-1; | |
256 | |
257 fsort[i] = manager->create_task(QUICK_SORT); | |
258 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*last_block_num); | |
259 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
|
260 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
|
261 if (i>0 && bsort[i-1]) { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
262 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
|
263 } |
227 | 264 fsort[i]->set_cpu(SPE_ANY); |
265 } | |
266 | |
267 if (split_num > 1) { | |
268 HTaskPtr bsort[half_num]; | |
269 | |
270 for (int i = 0; i < half_num-1; i++) { | |
271 bsort[i] = manager->create_task(QUICK_SORT); | |
272 bsort[i]->add_inData(&data[i*block_num+half_block_num], | |
273 sizeof(Data)*block_num); | |
274 bsort[i]->add_outData(&data[i*block_num+half_block_num], | |
275 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
|
276 bsort[i]->set_param(0,(memaddr)block_num); |
227 | 277 bsort[i]->set_cpu(SPE_ANY); |
278 } | |
279 | |
280 { | |
281 int i = half_num-1; | |
282 | |
283 bsort[i] = manager->create_task(QUICK_SORT); | |
284 bsort[i]->add_inData(&data[i*block_num+half_block_num], | |
285 sizeof(Data)*last_half_block_num); | |
286 bsort[i]->add_outData(&data[i*block_num+half_block_num], | |
287 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
|
288 bsort[i]->set_param(0,(memaddr)last_half_block_num); |
227 | 289 bsort[i]->set_cpu(SPE_ANY); |
290 } | |
291 | |
292 for (int i = 0; i < half_num; i++) { | |
293 bsort[i]->wait_for(fsort[i]); | |
294 bsort[i]->wait_for(fsort[i+1]); | |
295 bsort[i]->spawn(); | |
296 } | |
297 } | |
298 | |
299 for (int i = 0; i < split_num; i++) { | |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
300 fsort[i]->set_post(sort_restart, (void*)(half_num),(void*)manager); |
227 | 301 fsort[i]->spawn(); |
302 } | |
303 } | |
932
f4d7cf77ec3d
sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
674
diff
changeset
|
304 #endif |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
305 #endif |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
306 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
307 void check_data() |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
308 { |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
309 int flag = 1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
310 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
|
311 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
|
312 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
|
313 flag = 0; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
314 break; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
315 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
316 } |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
317 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
|
318 } |
227 | 319 |
320 void | |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
321 sort_init(SchedTask *manager, void *a, void *b) |
227 | 322 { |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
323 cpuNum = (int)a; |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
324 int length = (int)b; |
400 | 325 |
227 | 326 data = (DataPtr)manager->allocate(sizeof(Data)*length); |
327 data_length = length; | |
328 | |
934
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
329 int split_num = get_split_num(data_length, cpuNum); // data の分割数 |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
330 int half_num = split_num-1; |
da657af64afd
sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
932
diff
changeset
|
331 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
|
332 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
|
333 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
|
334 |
227 | 335 for (int i = 0; i < length; i++) { |
230 | 336 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
|
337 data[i].ptr = i; |
227 | 338 } |
339 | |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
651
diff
changeset
|
340 sort_start(manager); |
227 | 341 } |
400 | 342 |
651 | 343 /* end */ |