comparison example/many_task/sort.cc @ 941:0c11c2fd7e63

add no_auto_free flag on HTask
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 31 Jul 2010 17:50:38 +0900
parents 0d404f6c36a8
children a9c7784e5dae
comparison
equal deleted inserted replaced
940:0d404f6c36a8 941:0c11c2fd7e63
104 } 104 }
105 105
106 if (split_num > 1) { 106 if (split_num > 1) {
107 107
108 for (int i = 0; i < half_num-1; i++) { 108 for (int i = 0; i < half_num-1; i++) {
109 if (bsort[i]) manager->free_htask(bsort[i]);
109 bsort[i] = manager->create_task(QUICK_SORT, 110 bsort[i] = manager->create_task(QUICK_SORT,
110 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num, 111 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num,
111 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num); 112 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num);
112 bsort[i]->set_cpu(SPE_ANY); 113 bsort[i]->set_cpu(SPE_ANY);
113 } 114 }
114 115
115 { 116 {
116 int i = half_num-1; 117 int i = half_num-1;
117 118
119 if (bsort[i]) manager->free_htask(bsort[i]);
118 bsort[i] = manager->create_task(QUICK_SORT, 120 bsort[i] = manager->create_task(QUICK_SORT,
119 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num, 121 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num,
120 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num); 122 (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num);
121 bsort[i]->set_cpu(SPE_ANY); 123 bsort[i]->set_cpu(SPE_ANY);
122 } 124 }
123 125
124 for (int i = 0; i < half_num; i++) { 126 for (int i = 0; i < half_num; i++) {
125 bsort[i]->wait_for(fsort[i]); 127 bsort[i]->wait_for(fsort[i]);
126 bsort[i]->wait_for(fsort[i+1]); 128 bsort[i]->wait_for(fsort[i+1]);
129 bsort[i]->no_auto_free();
127 bsort[i]->spawn(); 130 bsort[i]->spawn();
128 } 131 }
129 } 132 }
130 133
131 HTaskPtr restart = manager->create_task(RESTART,0,0,0,0); 134 HTaskPtr restart = manager->create_task(RESTART,0,0,0,0);
184 } 187 }
185 fsort[i]->set_cpu(SPE_ANY); 188 fsort[i]->set_cpu(SPE_ANY);
186 } 189 }
187 190
188 if (split_num > 1) { 191 if (split_num > 1) {
189 HTaskPtr bsort[half_num];
190 192
191 for (int i = 0; i < half_num-1; i++) { 193 for (int i = 0; i < half_num-1; i++) {
194 if (bsort[i]) manager->free_htask(bsort[i]);
192 bsort[i] = manager->create_task(QUICK_SORT); 195 bsort[i] = manager->create_task(QUICK_SORT);
193 bsort[i]->add_inData(&data[i*block_num+half_block_num], 196 bsort[i]->add_inData(&data[i*block_num+half_block_num],
194 sizeof(Data)*block_num); 197 sizeof(Data)*block_num);
195 bsort[i]->add_outData(&data[i*block_num+half_block_num], 198 bsort[i]->add_outData(&data[i*block_num+half_block_num],
196 sizeof(Data)*block_num); 199 sizeof(Data)*block_num);
199 } 202 }
200 203
201 { 204 {
202 int i = half_num-1; 205 int i = half_num-1;
203 206
207 if (bsort[i]) manager->free_htask(bsort[i]);
204 bsort[i] = manager->create_task(QUICK_SORT); 208 bsort[i] = manager->create_task(QUICK_SORT);
205 bsort[i]->add_inData(&data[i*block_num+half_block_num], 209 bsort[i]->add_inData(&data[i*block_num+half_block_num],
206 sizeof(Data)*last_half_block_num); 210 sizeof(Data)*last_half_block_num);
207 bsort[i]->add_outData(&data[i*block_num+half_block_num], 211 bsort[i]->add_outData(&data[i*block_num+half_block_num],
208 sizeof(Data)*last_half_block_num); 212 sizeof(Data)*last_half_block_num);
211 } 215 }
212 216
213 for (int i = 0; i < half_num; i++) { 217 for (int i = 0; i < half_num; i++) {
214 bsort[i]->wait_for(fsort[i]); 218 bsort[i]->wait_for(fsort[i]);
215 bsort[i]->wait_for(fsort[i+1]); 219 bsort[i]->wait_for(fsort[i+1]);
220 bsort[i]->no_auto_free();
216 bsort[i]->spawn(); 221 bsort[i]->spawn();
217 } 222 }
218 } 223 }
219 224
220 HTaskPtr restart = manager->create_task(RESTART,0,0,0,0); 225 HTaskPtr restart = manager->create_task(RESTART,0,0,0,0);