Mercurial > hg > Game > Cerium
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 |