annotate example/many_task/sort.cc @ 936:178fbcc81fda draft

dead lock on spu/ppu mail
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 31 Jul 2010 05:31:12 +0900
parents 11b19708e613
children 20beb83a5a22
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
1 #include "TaskManager.h"
573
31d37456bbd4 example fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 567
diff changeset
2 #include "SchedTask.h"
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
3 #include "sort.h"
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
4 #include "Func.h"
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
5 #include <string.h>
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
6
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
7 static void sort_start(SchedTask *);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
8 extern void check_data();
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
9
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
10 static DataPtr data;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
11 static int data_length;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
12 static int cpuNum;
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
13
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
14 extern int all;
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
15
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
16 /**
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
17 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
18 * len の分割数を返す
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
19 *
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
20 * @param len sort する data の総数
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
21 * @param num 使用する SPE の数
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
22 *
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
23 * @return data の分割数
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
24 *
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
25 * TODO:
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
26 * len が num 以下とか考えてません
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
27 */
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
28 static int
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
29 get_split_num(int len, int num)
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
30 {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
31 if (len / num < MAX_BLOCK_SIZE) {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
32 return num;
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
33 } else {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
34 // 切り上げ
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
35 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE;
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
36 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
37 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
38
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
39
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
40 HTaskPtr *fsort;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
41 HTaskPtr *bsort;
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
42 int split_num;
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
43
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
44
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
45 /**
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
46 * btask が全て終了したら、再び sort_start を実行する
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
47 * @param d 生成された btask の数
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
48 */
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
49
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
50 SchedDefineTask1(RESTART, sort_restart );
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
51
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
52 static int
573
31d37456bbd4 example fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 567
diff changeset
53 sort_restart(SchedTask *s, void *d, void *e)
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
54 {
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
55 static int ccc = 0;
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
56
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
57 printf("restarted %d %% %d\n",ccc++,split_num);
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
58 sort_start(s);
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
59 return 0;
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
60 }
932
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
61 #ifdef USE_SIMPLE_TASK
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
62
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
63 static void
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
64 sort_start(SchedTask *manager)
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
65 {
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
66 int half_num = split_num-1;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
67 static int sort_count = split_num; // sort 完了に必要な回数
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
68
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
69 // 一つのタスクで sort する data 数
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
70 int block_num = (data_length + split_num -1)/split_num;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
71 int half_block_num = block_num/2;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
72
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
73 int last_block_num = data_length - (split_num-1)*block_num;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
74 int last_half_block_num = half_block_num+(last_block_num/2);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
75
932
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
76 if (--sort_count < 0) {
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
77 return;
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
78 }
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
79
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
80
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
81 for (int i = 0; i < split_num-1; i++) {
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
82 fsort[i] = manager->create_task(QUICK_SORT,
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
83 (memaddr)&data[i*block_num], sizeof(Data)*block_num,
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
84 (memaddr)&data[i*block_num], sizeof(Data)*block_num);
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
85 if (i>0 && bsort[i-1]) {
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
86 fsort[i]->wait_for(bsort[i-1]);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
87 }
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
88 if (i<split_num-2 && bsort[i]) {
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
89 fsort[i]->wait_for(bsort[i]);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
90 }
932
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
91 fsort[i]->set_cpu(SPE_ANY);
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
92 }
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
93
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
94 // 最後の block は端数なので last_block_num を使う
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
95 {
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
96 int i = split_num-1;
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
97
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
98 fsort[i] = manager->create_task(QUICK_SORT,
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
99 (memaddr)&data[i*block_num], sizeof(Data)*last_block_num,
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
100 (memaddr)&data[i*block_num], sizeof(Data)*last_block_num);
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
101 if (i>0 && bsort[i-1]) {
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
102 fsort[i]->wait_for(bsort[i-1]);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
103 }
932
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
104 fsort[i]->set_cpu(SPE_ANY);
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
105 }
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
106
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
107 if (split_num > 1) {
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
108
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
109 for (int i = 0; i < half_num-1; i++) {
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
110 bsort[i] = manager->create_task(QUICK_SORT,
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
111 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num,
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
112 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num);
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
113 bsort[i]->set_cpu(SPE_ANY);
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
114 }
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
115
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
116 {
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
117 int i = half_num-1;
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
118
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
119 bsort[i] = manager->create_task(QUICK_SORT,
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
120 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num,
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
121 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num);
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
122 bsort[i]->set_cpu(SPE_ANY);
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
123 }
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
124
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
125 for (int i = 0; i < half_num; i++) {
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
126 bsort[i]->wait_for(fsort[i]);
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
127 bsort[i]->wait_for(fsort[i+1]);
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
128 bsort[i]->spawn();
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
129 }
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
130 }
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
131
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
132 HTaskPtr restart = manager->create_task(RESTART,0,0,0,0);
932
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
133 for (int i = 0; i < split_num; i++) {
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
134 if (!all) restart->wait_for(fsort[i]);
932
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
135 fsort[i]->spawn();
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
136 }
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
137 restart->spawn();
932
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
138 }
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
139
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
140 #else
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
141
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
142 static void
674
07351a5a51c9 fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 651
diff changeset
143 sort_start(SchedTask *manager)
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
144 {
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
145 int half_num = split_num-1;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
146 static int sort_count = split_num; // sort 完了に必要な回数
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
147
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
148 // 一つのタスクで sort する data 数
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
149 int block_num = (data_length + split_num -1)/split_num;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
150 int half_block_num = block_num/2;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
151
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
152 int last_block_num = data_length - (split_num-1)*block_num;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
153 int last_half_block_num = half_block_num+(last_block_num/2);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
154
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
155
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
156 if (--sort_count < 0) {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
157 return;
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
158 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
159
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
160
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
161 for (int i = 0; i < split_num-1; i++) {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
162 fsort[i] = manager->create_task(QUICK_SORT);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
163 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*block_num);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
164 fsort[i]->add_outData(&data[i*block_num], sizeof(Data)*block_num);
625
94d82f2c842f 64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 573
diff changeset
165 fsort[i]->set_param(0,(memaddr)block_num);
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
166 if (i>0 && bsort[i-1]) {
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
167 fsort[i]->wait_for(bsort[i-1]);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
168 }
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
169 if (i<split_num-2 && bsort[i]) {
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
170 fsort[i]->wait_for(bsort[i]);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
171 }
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
172 fsort[i]->set_cpu(SPE_ANY);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
173 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
174
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
175 // 最後の block は端数なので last_block_num を使う
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
176 {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
177 int i = split_num-1;
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
178
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
179 fsort[i] = manager->create_task(QUICK_SORT);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
180 fsort[i]->add_inData(&data[i*block_num], sizeof(Data)*last_block_num);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
181 fsort[i]->add_outData(&data[i*block_num], sizeof(Data)*last_block_num);
625
94d82f2c842f 64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 573
diff changeset
182 fsort[i]->set_param(0,(memaddr)last_block_num);
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
183 if (i>0 && bsort[i-1]) {
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
184 fsort[i]->wait_for(bsort[i-1]);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
185 }
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
186 fsort[i]->set_cpu(SPE_ANY);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
187 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
188
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
189 if (split_num > 1) {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
190 HTaskPtr bsort[half_num];
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
191
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
192 for (int i = 0; i < half_num-1; i++) {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
193 bsort[i] = manager->create_task(QUICK_SORT);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
194 bsort[i]->add_inData(&data[i*block_num+half_block_num],
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
195 sizeof(Data)*block_num);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
196 bsort[i]->add_outData(&data[i*block_num+half_block_num],
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
197 sizeof(Data)*block_num);
625
94d82f2c842f 64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 573
diff changeset
198 bsort[i]->set_param(0,(memaddr)block_num);
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
199 bsort[i]->set_cpu(SPE_ANY);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
200 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
201
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
202 {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
203 int i = half_num-1;
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
204
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
205 bsort[i] = manager->create_task(QUICK_SORT);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
206 bsort[i]->add_inData(&data[i*block_num+half_block_num],
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
207 sizeof(Data)*last_half_block_num);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
208 bsort[i]->add_outData(&data[i*block_num+half_block_num],
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
209 sizeof(Data)*last_half_block_num);
625
94d82f2c842f 64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 573
diff changeset
210 bsort[i]->set_param(0,(memaddr)last_half_block_num);
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
211 bsort[i]->set_cpu(SPE_ANY);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
212 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
213
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
214 for (int i = 0; i < half_num; i++) {
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
215 bsort[i]->wait_for(fsort[i]);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
216 bsort[i]->wait_for(fsort[i+1]);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
217 bsort[i]->spawn();
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
218 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
219 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
220
936
178fbcc81fda dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 935
diff changeset
221 HTask *restart = manager->create_task(RESTART,0,0,0,0);
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
222 for (int i = 0; i < split_num; i++) {
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
223 if (!all) restart->wait_for(fsort[i]);
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
224 fsort[i]->spawn();
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
225 }
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
226 restart->spawn();
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
227
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
228 }
932
53ad3a61b40b sort test (add swap())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 674
diff changeset
229 #endif
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
230
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
231 void check_data()
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
232 {
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
233 int flag = 1;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
234 for(int i=0; i< data_length-1;i++) {
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
235 if (data[i].index>data[i+1].index) {
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
236 printf("Data are not sorted at %d. %d > %d \n",i, data[i].index,data[i+1].index);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
237 flag = 0;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
238 break;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
239 }
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
240 }
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
241 if (flag) printf("Data are sorted\n");
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
242 }
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
243
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
244
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
245 void
674
07351a5a51c9 fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 651
diff changeset
246 sort_init(SchedTask *manager, void *a, void *b)
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
247 {
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
248 cpuNum = (int)a;
674
07351a5a51c9 fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 651
diff changeset
249 int length = (int)b;
400
984e7890db0c Fix examples.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 230
diff changeset
250
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
251 data = (DataPtr)manager->allocate(sizeof(Data)*length);
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
252 data_length = length;
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
253
935
11b19708e613 -a option for sort
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 934
diff changeset
254 split_num = get_split_num(data_length, cpuNum); // data の分割数
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
255 int half_num = split_num-1;
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
256 fsort = (HTaskPtr*)manager->allocate(sizeof(HTaskPtr)*split_num);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
257 bsort = (HTaskPtr*)manager->allocate(sizeof(HTaskPtr)*half_num);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
258 memset((void*)bsort,0, sizeof(HTaskPtr)*half_num);
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
259
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
260 for (int i = 0; i < length; i++) {
230
56314060907f fix Random
gongo@localhost.localdomain
parents: 227
diff changeset
261 data[i].index = manager->get_random()%10000;
934
83b64b7a51bd sort fix ( not working now )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 932
diff changeset
262 data[i].ptr = i;
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
263 }
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
264
674
07351a5a51c9 fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 651
diff changeset
265 sort_start(manager);
227
e7faaf516be1 add sort
gongo@localhost.localdomain
parents:
diff changeset
266 }
400
984e7890db0c Fix examples.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 230
diff changeset
267
651
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 625
diff changeset
268 /* end */