annotate example/many_task/sort.cc @ 945:a9c7784e5dae

sort example fix ( simple task accepts one param and more compatible with old task)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 01 Aug 2010 19:29:27 +0900
parents 0c11c2fd7e63
children 6d3c954e510a
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"
934
da657af64afd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
5 #include <string.h>
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
6
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
7 extern int get_split_num(int len, int num);
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
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
9
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
10 /**
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
11 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
12 * len の分割数を返す
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
13 *
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
14 * @param len sort する data の総数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
15 * @param num 使用する SPE の数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
16 *
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
17 * @return data の分割数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
18 *
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
19 * TODO:
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
20 * len が num 以下とか考えてません
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
21 */
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
22 int
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
23 get_split_num(int len, int num)
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
24 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
25 if (len / num < MAX_BLOCK_SIZE) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
26 return num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
27 } else {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
28 // 切り上げ
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
29 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
30 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
31 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
32
934
da657af64afd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
33
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
34 /**
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
35 * btask が全て終了したら、再び sort_start を実行する
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
36 * @param d 生成された btask の数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
37 */
935
e54842e4d97b -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
38
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
39 SchedDefineTask1(SortSimple, sort_start );
935
e54842e4d97b -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
40
e54842e4d97b -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
41 static int
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
42 sort_start(SchedTask *manager, void *d, void *e)
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
43 {
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
44 Sort *s = (Sort*)manager->get_param(0);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
45 int half_num = s->split_num-1;
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
46 static int sort_count = s->split_num; // sort 完了に必要な回数
934
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 // 一つのタスクで sort する data 数
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
49 int block_num = (s->data_length + s->split_num -1)/s->split_num;
934
da657af64afd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
50 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
51
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
52 int last_block_num = s->data_length - (s->split_num-1)*block_num;
934
da657af64afd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
53 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
54
932
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
55 if (--sort_count < 0) {
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
56 return 0;
932
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
57 }
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
58
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
59
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
60 for (int i = 0; i < s->split_num-1; i++) {
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
61 s->fsort[i] = manager->create_task(QUICK_SORT,
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
62 (memaddr)&s->data[i*block_num], sizeof(Data)*block_num,
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
63 (memaddr)&s->data[i*block_num], sizeof(Data)*block_num);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
64 if (i>0 && s->bsort[i-1]) {
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
65 s->fsort[i]->wait_for(s->bsort[i-1]);
934
da657af64afd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
66 }
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
67 if (i<s->split_num-2 && s->bsort[i]) {
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
68 s->fsort[i]->wait_for(s->bsort[i]);
934
da657af64afd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
69 }
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
70 s->fsort[i]->set_cpu(SPE_ANY);
932
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
71 }
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
72
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
73 // 最後の block は端数なので last_block_num を使う
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
74 {
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
75 int i = s->split_num-1;
932
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
76
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
77 s->fsort[i] = manager->create_task(QUICK_SORT,
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
78 (memaddr)&s->data[i*block_num], sizeof(Data)*last_block_num,
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
79 (memaddr)&s->data[i*block_num], sizeof(Data)*last_block_num);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
80 if (i>0 && s->bsort[i-1]) {
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
81 s->fsort[i]->wait_for(s->bsort[i-1]);
934
da657af64afd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
82 }
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
83 s->fsort[i]->set_cpu(SPE_ANY);
932
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
84 }
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
85
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
86 if (s->split_num > 1) {
932
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 for (int i = 0; i < half_num-1; i++) {
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
89 if (s->bsort[i]) manager->free_htask(s->bsort[i]);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
90 s->bsort[i] = manager->create_task(QUICK_SORT,
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
91 (memaddr)&s->data[i*block_num+half_block_num], sizeof(Data)*block_num,
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
92 (memaddr)&s->data[i*block_num+half_block_num], sizeof(Data)*block_num);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
93 s->bsort[i]->set_cpu(SPE_ANY);
932
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
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 = half_num-1;
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
98
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
99 if (s->bsort[i]) manager->free_htask(s->bsort[i]);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
100 s->bsort[i] = manager->create_task(QUICK_SORT,
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
101 (memaddr)&s->data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num,
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
102 (memaddr)&s->data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
103 s->bsort[i]->set_cpu(SPE_ANY);
932
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 for (int i = 0; i < half_num; i++) {
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
107 s->bsort[i]->wait_for(s->fsort[i]);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
108 s->bsort[i]->wait_for(s->fsort[i+1]);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
109 s->bsort[i]->no_auto_free();
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
110 s->bsort[i]->spawn();
932
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
111 }
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
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
114 HTaskPtr restart = manager->create_task(SortSimple,0,0,0,0);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
115 restart->set_param(0,(memaddr)s);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
116 if (!all) restart->wait_for(s->fsort[0]);
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
117 for (int i = 0; i < s->split_num; i++) {
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
118 s->fsort[i]->spawn();
932
f4d7cf77ec3d sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
119 }
935
e54842e4d97b -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
120 restart->spawn();
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
121 return 0;
934
da657af64afd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
122 }
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
123
935
e54842e4d97b -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
124
651
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 625
diff changeset
125 /* end */