annotate example/many_task/sort.cc @ 230:2b114977852d

fix Random
author gongo@localhost.localdomain
date Fri, 13 Feb 2009 10:53:58 +0900
parents d54cbfafcb82
children 00fe05184a02
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"
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
2 #include "sort.h"
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
3 #include "Func.h"
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
4
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
5 DataPtr data; // sort array
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
6 int data_length;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
7 static int sort_count; // sort 完了に必要な回数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
8 static int split_num; // data の分割数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
9 static int half_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
10 static int block_num; // 一つのタスクで sort する data 数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
11 static int last_block_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
12 static int half_block_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
13 static int last_half_block_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
14
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
15 static void sort_restart(void *);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
16 static void sort_start(void);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
17
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
18 /**
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
19 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
20 * len の分割数を返す
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
21 *
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
22 * @param len sort する data の総数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
23 * @param num 使用する SPE の数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
24 *
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
25 * @return data の分割数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
26 *
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
27 * TODO:
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
28 * len が num 以下とか考えてません
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
29 */
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
30 static int
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
31 get_split_num(int len, int num)
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
32 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
33 if (len / num < MAX_BLOCK_SIZE) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
34 return num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
35 } else {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
36 // 切り上げ
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
37 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
38 }
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 * btask が全て終了したら、再び sort_start を実行する
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
43 * @param d 生成された btask の数
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
44 */
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
45 static void
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
46 sort_restart(void *d)
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
47 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
48 static int cnt = 0;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
49 int max = (int)d;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
50
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
51 if (++cnt == max) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
52 cnt = 0;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
53 sort_start();
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
54 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
55 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
56
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
57 static void
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
58 sort_start(void)
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
59 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
60 if (--sort_count < 0) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
61 return;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
62 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
63
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
64 HTaskPtr fsort[split_num];
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
65
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
66 for (int i = 0; i < split_num-1; i++) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
67 fsort[i] = manager->create_task(QUICK_SORT);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
68 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
69 fsort[i]->add_outData(&data[i*block_num], sizeof(Data)*block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
70 fsort[i]->add_param(block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
71 fsort[i]->set_cpu(SPE_ANY);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
72 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
73
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
74 // 最後の block は端数なので last_block_num を使う
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
75 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
76 int i = split_num-1;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
77
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
78 fsort[i] = manager->create_task(QUICK_SORT);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
79 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*last_block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
80 fsort[i]->add_outData(&data[i*block_num], sizeof(Data)*last_block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
81 fsort[i]->add_param(last_block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
82 fsort[i]->set_cpu(SPE_ANY);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
83 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
84
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
85 if (split_num > 1) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
86 HTaskPtr bsort[half_num];
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
87
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
88 for (int i = 0; i < half_num-1; i++) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
89 bsort[i] = manager->create_task(QUICK_SORT);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
90 bsort[i]->add_inData(&data[i*block_num+half_block_num],
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
91 sizeof(Data)*block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
92 bsort[i]->add_outData(&data[i*block_num+half_block_num],
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
93 sizeof(Data)*block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
94 bsort[i]->add_param(block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
95 bsort[i]->set_cpu(SPE_ANY);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
96 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
97
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
98 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
99 int i = half_num-1;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
100
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
101 bsort[i] = manager->create_task(QUICK_SORT);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
102 bsort[i]->add_inData(&data[i*block_num+half_block_num],
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
103 sizeof(Data)*last_half_block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
104 bsort[i]->add_outData(&data[i*block_num+half_block_num],
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
105 sizeof(Data)*last_half_block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
106 bsort[i]->add_param(last_half_block_num);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
107 bsort[i]->set_cpu(SPE_ANY);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
108 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
109
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
110 for (int i = 0; i < half_num; i++) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
111 bsort[i]->wait_for(fsort[i]);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
112 bsort[i]->wait_for(fsort[i+1]);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
113 bsort[i]->set_post(sort_restart, (void*)(half_num));
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
114 bsort[i]->spawn();
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
115 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
116 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
117
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
118 for (int i = 0; i < split_num; i++) {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
119 fsort[i]->spawn();
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
120 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
121 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
122
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
123 void
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
124 sort_init(int cpuNum, int length)
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
125 {
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
126 data = (DataPtr)manager->allocate(sizeof(Data)*length);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
127 data_length = length;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
128
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
129 for (int i = 0; i < length; i++) {
230
2b114977852d fix Random
gongo@localhost.localdomain
parents: 227
diff changeset
130 data[i].index = manager->get_random()%10000;
227
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
131 data[i].ptr = 0;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
132 }
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
133
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
134 split_num = get_split_num(length, cpuNum);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
135 half_num = split_num-1;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
136 sort_count = split_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
137
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
138 block_num = (length + split_num -1)/split_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
139 half_block_num = block_num/2;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
140
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
141 last_block_num = length - (split_num-1)*block_num;
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
142 last_half_block_num = half_block_num+(last_block_num/2);
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
143
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
144 sort_start();
d54cbfafcb82 add sort
gongo@localhost.localdomain
parents:
diff changeset
145 }