comparison example/fft/main.cc @ 2018:433043c56a0c draft

fix fft
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Tue, 15 Jul 2014 01:41:57 +0900
parents 1d7d1e398833
children 892c77a1529f
comparison
equal deleted inserted replaced
2017:1d7d1e398833 2018:433043c56a0c
105 105
106 return 0; 106 return 0;
107 } 107 }
108 108
109 HTask* 109 HTask*
110 fftCore(TaskManager *manager,cl_float2 *dst, cl_float2 *src, cl_float2 *spin, long m, enum Mode direction,HTask* waitTask) 110 fftCore(TaskManager *manager,cl_float2 *dst, cl_float2 *src, cl_float2 *spin, long m, enum Mode direction, HTask* waitTask, bool last)
111 { 111 {
112 long direction_flag; 112 long direction_flag;
113 switch (direction) { 113 switch (direction) {
114 case forward:direction_flag = 0x00000000; break; 114 case forward:direction_flag = 0x00000000; break;
115 case inverse:direction_flag = 0x80000000; break; 115 case inverse:direction_flag = 0x80000000; break;
138 bfly->set_param(0,n); 138 bfly->set_param(0,n);
139 bfly->set_param(1,direction_flag); 139 bfly->set_param(1,direction_flag);
140 bfly->set_param(2,(long)iter); 140 bfly->set_param(2,(long)iter);
141 bfly->set_inData(0, dst, length_dst*sizeof(cl_float2)); 141 bfly->set_inData(0, dst, length_dst*sizeof(cl_float2));
142 bfly->set_inData(1, spin, sizeof(cl_float2)*(n/2)); 142 bfly->set_inData(1, spin, sizeof(cl_float2)*(n/2));
143 bfly->set_outData(0,dst,length_dst*sizeof(cl_float2)); 143 bfly->set_outData(0, dst,length_dst*sizeof(cl_float2));
144 bfly->set_cpu(spe_cpu); 144 bfly->set_cpu(spe_cpu);
145 bfly->flip(); 145 bfly->flip();
146 bfly->wait_for(waitTask); 146 bfly->wait_for(waitTask);
147 bfly->iterate(gws[0],gws[1]); 147 bfly->iterate(gws[0],gws[1]);
148 waitTask = bfly; 148 waitTask = bfly;
149 } 149 }
150 150
151 if (direction == inverse) { 151 if (direction == inverse) {
152 setWorkSize(gws,lws,n,n); 152 setWorkSize(gws,lws,n,n);
153 HTask *norm = manager->create_task(NORMALIZATION); 153 HTask *norm = manager->create_task(NORMALIZATION);
154 norm->set_inData(0,dst,length_dst*sizeof(cl_float2)); 154 norm->set_inData(0, dst,length_dst*sizeof(cl_float2));
155 if (!last)
156 norm->flip();
155 norm->set_outData(0, dst, length_dst*sizeof(cl_float2)); 157 norm->set_outData(0, dst, length_dst*sizeof(cl_float2));
156 norm->set_param(0,n); 158 norm->set_param(0,n);
157 norm->set_cpu(spe_cpu); 159 norm->set_cpu(spe_cpu);
158 norm->wait_for(waitTask); 160 norm->wait_for(waitTask);
159 norm->iterate(gws[0],gws[1]); 161 norm->iterate(gws[0],gws[1]);
226 int length_w = n / 2; 228 int length_w = n / 2;
227 HTask* sfac = manager->create_task(SPIN_FACT); 229 HTask* sfac = manager->create_task(SPIN_FACT);
228 sfac->set_outData(0, wm, length_w*sizeof(cl_float2)); 230 sfac->set_outData(0, wm, length_w*sizeof(cl_float2));
229 sfac->set_param(0,n); 231 sfac->set_param(0,n);
230 sfac->set_cpu(spe_cpu); 232 sfac->set_cpu(spe_cpu);
233 sfac->flip();
231 sfac->iterate(gws[0]); 234 sfac->iterate(gws[0]);
232 235
233 // Butterfly Operation 236 // Butterfly Operation
234 waitTask = fftCore(manager, rm, xm, wm, m, forward,sfac); 237 waitTask = fftCore(manager, rm, xm, wm, m, forward, sfac, false);
235 238
236 // Transpose matrix 239 // Transpose matrix
237 int length_r =n*n; 240 int length_r =n*n;
238 setWorkSize(gws,lws,n,n); 241 setWorkSize(gws,lws,n,n);
239 HTask* first_trns = manager->create_task(TRANSPOSE); 242 HTask* first_trns = manager->create_task(TRANSPOSE);
244 first_trns->flip(); 247 first_trns->flip();
245 first_trns->wait_for(waitTask); 248 first_trns->wait_for(waitTask);
246 first_trns->iterate(gws[0],gws[1]); 249 first_trns->iterate(gws[0],gws[1]);
247 250
248 // Butterfly Operation 251 // Butterfly Operation
249 waitTask = fftCore(manager, rm, xm, wm, m, forward,first_trns); 252 waitTask = fftCore(manager, rm, xm, wm, m, forward, first_trns, false);
250 253
251 // Apply high-pass filter 254 // Apply high-pass filter
252 HTask *hpfl = manager->create_task(HIGH_PASS_FILTER); 255 HTask *hpfl = manager->create_task(HIGH_PASS_FILTER);
253 cl_int radius = n/8; 256 cl_int radius = n/8;
254 setWorkSize(gws,lws,n,n); 257 setWorkSize(gws,lws,n,n);
262 hpfl->iterate(gws[0],gws[1]); 265 hpfl->iterate(gws[0],gws[1]);
263 266
264 // Inverse FFT 267 // Inverse FFT
265 268
266 // Butterfly Operation 269 // Butterfly Operation
267 waitTask = fftCore(manager,xm, rm, wm, m, inverse,hpfl); 270 waitTask = fftCore(manager,xm, rm, wm, m, inverse, hpfl, false);
268 271
269 // Transpose matrix 272 // Transpose matrix
270 setWorkSize(gws,lws,n,n); 273 setWorkSize(gws,lws,n,n);
271 HTask* second_trns = manager->create_task(TRANSPOSE); 274 HTask* second_trns = manager->create_task(TRANSPOSE);
272 second_trns->set_inData(0,xm,length_r*sizeof(cl_float2)); 275 second_trns->set_inData(0,xm,length_r*sizeof(cl_float2));
277 second_trns->wait_for(waitTask); 280 second_trns->wait_for(waitTask);
278 second_trns->iterate(gws[0],gws[1]); 281 second_trns->iterate(gws[0],gws[1]);
279 282
280 // Butterfly Operation 283 // Butterfly Operation
281 284
282 waitTask = fftCore(manager,xm, rm, wm, m, inverse, second_trns); 285 waitTask = fftCore(manager,xm, rm, wm, m, inverse, second_trns, true);
283 } 286 }
284 287
285 int TMmain(TaskManager *manager, int argc, char** argv) { 288 int TMmain(TaskManager *manager, int argc, char** argv) {
286 task_init(); 289 task_init();
287 #ifdef GPU 290 #ifdef GPU