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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
1 #include "TaskManager.h"
573
2f4b5ce2a515 example fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 567
diff changeset
2 #include "SchedTask.h"
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
3 #include "sort.h"
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
4 #include "Func.h"
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
5
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
6 DataPtr data; // sort array
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
7 int data_length;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
8 static int sort_count; // sort 完了に必要な回数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
9 static int split_num; // data の分割数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
10 static int half_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
11 static int block_num; // 一つのタスクで sort する data 数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
12 static int last_block_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
13 static int half_block_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
14 static int last_half_block_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
15
573
2f4b5ce2a515 example fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 567
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
18
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
19 /**
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
20 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
21 * len の分割数を返す
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
22 *
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
23 * @param len sort する data の総数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
24 * @param num 使用する SPE の数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
25 *
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
26 * @return data の分割数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
27 *
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
28 * TODO:
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
29 * len が num 以下とか考えてません
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
30 */
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
31 static int
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
32 get_split_num(int len, int num)
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
33 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
34 if (len / num < MAX_BLOCK_SIZE) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
35 return num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
36 } else {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
37 // 切り上げ
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
38 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
39 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
40 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
41
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
42 /**
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
43 * btask が全て終了したら、再び sort_start を実行する
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
44 * @param d 生成された btask の数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
45 */
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
46 static void
573
2f4b5ce2a515 example fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 567
diff changeset
47 sort_restart(SchedTask *s, void *d, void *e)
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
48 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
52
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
53 if (++cnt == max) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
57 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
58 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
124 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
125 if (--sort_count < 0) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
126 return;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
127 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
128
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
129 HTaskPtr fsort[split_num];
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
130
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
131 for (int i = 0; i < split_num-1; i++) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
132 fsort[i] = manager->create_task(QUICK_SORT);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
133 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
136 fsort[i]->set_cpu(SPE_ANY);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
137 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
138
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
139 // 最後の block は端数なので last_block_num を使う
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
140 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
141 int i = split_num-1;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
142
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
143 fsort[i] = manager->create_task(QUICK_SORT);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
144 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*last_block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
147 fsort[i]->set_cpu(SPE_ANY);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
148 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
149
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
150 if (split_num > 1) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
151 HTaskPtr bsort[half_num];
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
152
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
153 for (int i = 0; i < half_num-1; i++) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
154 bsort[i] = manager->create_task(QUICK_SORT);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
155 bsort[i]->add_inData(&data[i*block_num+half_block_num],
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
156 sizeof(Data)*block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
157 bsort[i]->add_outData(&data[i*block_num+half_block_num],
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
160 bsort[i]->set_cpu(SPE_ANY);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
161 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
162
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
163 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
164 int i = half_num-1;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
165
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
166 bsort[i] = manager->create_task(QUICK_SORT);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
167 bsort[i]->add_inData(&data[i*block_num+half_block_num],
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
168 sizeof(Data)*last_half_block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
169 bsort[i]->add_outData(&data[i*block_num+half_block_num],
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
172 bsort[i]->set_cpu(SPE_ANY);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
173 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
174
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
175 for (int i = 0; i < half_num; i++) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
176 bsort[i]->wait_for(fsort[i]);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
179 bsort[i]->spawn();
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
180 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
181 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
182
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
183 for (int i = 0; i < split_num; i++) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
184 fsort[i]->spawn();
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
185 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
186 }
932
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
187 #endif
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
188
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
00fe05184a02 Fix examples.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 230
diff changeset
194
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
195 data = (DataPtr)manager->allocate(sizeof(Data)*length);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
196 data_length = length;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
197
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
198 for (int i = 0; i < length; i++) {
230
2b114977852d fix Random
gongo@localhost.localdomain
parents: 227
diff changeset
199 data[i].index = manager->get_random()%10000;
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
200 data[i].ptr = 0;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
201 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
202
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
203 split_num = get_split_num(length, cpuNum);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
204 half_num = split_num-1;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
205 sort_count = split_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
206
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
207 block_num = (length + split_num -1)/split_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
208 half_block_num = block_num/2;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
209
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
210 last_block_num = length - (split_num-1)*block_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
211 last_half_block_num = half_block_num+(last_block_num/2);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
214 }
400
00fe05184a02 Fix examples.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 230
diff changeset
215
651
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 625
diff changeset
216 /* end */