comparison fft_fixstart/main.cc @ 8:1b8da19bb31c

change time measure point
author Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
date Tue, 05 Feb 2013 16:40:13 +0900
parents db074091ed0b
children ed3d4a769bf3
comparison
equal deleted inserted replaced
7:ea2e7ce9d5bb 8:1b8da19bb31c
127 return 0; 127 return 0;
128 } 128 }
129 129
130 char * 130 char *
131 init(int argc, char**argv){ 131 init(int argc, char**argv){
132 132
133 char *filename = 0; 133 char *filename = 0;
134 134
135 for (int i = 1; argv[i]; ++i) { 135 for (int i = 1; argv[i]; ++i) {
136 if (strcmp(argv[i], "-file") == 0) { 136 if (strcmp(argv[i], "-file") == 0) {
137 filename = argv[i+1]; 137 filename = argv[i+1];
168 cl_float2 *rm; 168 cl_float2 *rm;
169 cl_float2 *wm; 169 cl_float2 *wm;
170 170
171 pgm_t ipgm; 171 pgm_t ipgm;
172 pgm_t opgm; 172 pgm_t opgm;
173 173
174 const char fileName[] = "./fft.cl"; 174 const char fileName[] = "./fft.cl";
175 size_t source_size; 175 size_t source_size;
176 char *source_str; 176 char *source_str;
177 cl_int i, j; 177 cl_int i, j;
178 cl_int n; 178 cl_int n;
181 size_t gws[2]; 181 size_t gws[2];
182 size_t lws[2]; 182 size_t lws[2];
183 183
184 /* Load kernel source code */ 184 /* Load kernel source code */
185 int fd = open(fileName, O_RDONLY); 185 int fd = open(fileName, O_RDONLY);
186 186
187 if (fd<0) { 187 if (fd<0) {
188 fprintf(stderr, "Failed to load kernel %s.\n",fileName); 188 fprintf(stderr, "Failed to load kernel %s.\n",fileName);
189 exit(1); 189 exit(1);
190 } 190 }
191 struct stat stats; 191 struct stat stats;
198 source_str = (char*)alloca(size); 198 source_str = (char*)alloca(size);
199 source_size = read(fd, source_str, size); 199 source_size = read(fd, source_str, size);
200 close( fd ); 200 close( fd );
201 201
202 char * pgm_file = init(argc,argv); 202 char * pgm_file = init(argc,argv);
203 203
204 /* Read image */ 204 /* Read image */
205 int err = readPGM(&ipgm, pgm_file); 205 int err = readPGM(&ipgm, pgm_file);
206 if (err<0) { 206 if (err<0) {
207 fprintf(stderr, "Failed to read image file.\n"); 207 fprintf(stderr, "Failed to read image file.\n");
208 exit(1); 208 exit(1);
209 } 209 }
210 210
211 n = ipgm.width; 211 n = ipgm.width;
212 m = (cl_int)(log((double)n)/log(2.0)); 212 m = (cl_int)(log((double)n)/log(2.0));
213 213
231 context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret); 231 context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
232 232
233 /* Create Command queue */ 233 /* Create Command queue */
234 queue = clCreateCommandQueue(context, device_id, 0, &ret); 234 queue = clCreateCommandQueue(context, device_id, 0, &ret);
235 235
236 st_time = getTime();
236 /* Create Buffer Objects */ 237 /* Create Buffer Objects */
237 xmobj = clCreateBuffer(context, CL_MEM_READ_WRITE, n*n*sizeof(cl_float2), NULL, &ret); 238 xmobj = clCreateBuffer(context, CL_MEM_READ_WRITE, n*n*sizeof(cl_float2), NULL, &ret);
238 rmobj = clCreateBuffer(context, CL_MEM_READ_WRITE, n*n*sizeof(cl_float2), NULL, &ret); 239 rmobj = clCreateBuffer(context, CL_MEM_READ_WRITE, n*n*sizeof(cl_float2), NULL, &ret);
239 wmobj = clCreateBuffer(context, CL_MEM_READ_WRITE, (n/2)*sizeof(cl_float2), NULL, &ret); 240 wmobj = clCreateBuffer(context, CL_MEM_READ_WRITE, (n/2)*sizeof(cl_float2), NULL, &ret);
240 241
241
242 st_time = getTime();
243
244 /* Transfer data to memory buffer */ 242 /* Transfer data to memory buffer */
245 ret = clEnqueueWriteBuffer(queue, xmobj, CL_TRUE, 0, n*n*sizeof(cl_float2), xm, 0, NULL, NULL); 243 ret = clEnqueueWriteBuffer(queue, xmobj, CL_TRUE, 0, n*n*sizeof(cl_float2), xm, 0, NULL, NULL);
246 244
247 /* Create kernel program from source */ 245 /* Create kernel program from source */
248 program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret); 246 program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret);
251 ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL); 249 ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
252 250
253 if (ret<0) { 251 if (ret<0) {
254 size_t size; 252 size_t size;
255 clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, 0, NULL, &size); 253 clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, 0, NULL, &size);
256 254
257 char *log = new char[size]; 255 char *log = new char[size];
258 clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, size, log, NULL); 256 clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, size, log, NULL);
259 printf("%s ",log); 257 printf("%s ",log);
260 exit (ret); 258 exit (ret);
261 } 259 }
302 ret = clSetKernelArg(trns, 1, sizeof(cl_mem), (void *)&xmobj); 300 ret = clSetKernelArg(trns, 1, sizeof(cl_mem), (void *)&xmobj);
303 setWorkSize(gws, lws, n, n); 301 setWorkSize(gws, lws, n, n);
304 ret = clEnqueueTask(queue, trns, 0, NULL, NULL); 302 ret = clEnqueueTask(queue, trns, 0, NULL, NULL);
305 303
306 /* Butterfly Operation */ 304 /* Butterfly Operation */
307 305
308 fftCore(xmobj, rmobj, wmobj, m, inverse); 306 fftCore(xmobj, rmobj, wmobj, m, inverse);
309 307
310 /* Read data from memory buffer */ 308 /* Read data from memory buffer */
311 ret = clEnqueueReadBuffer(queue, xmobj, CL_TRUE, 0, n*n*sizeof(cl_float2), xm, 0, NULL, NULL); 309 ret = clEnqueueReadBuffer(queue, xmobj, CL_TRUE, 0, n*n*sizeof(cl_float2), xm, 0, NULL, NULL);
312 310
313 /* */ 311 /* */
314 float* ampd; 312 float* ampd;
315 ampd = (float*)malloc(n*n*sizeof(float)); 313 ampd = (float*)malloc(n*n*sizeof(float));
320 } 318 }
321 opgm.width = n; 319 opgm.width = n;
322 opgm.height = n; 320 opgm.height = n;
323 normalizeF2PGM(&opgm, ampd); 321 normalizeF2PGM(&opgm, ampd);
324 free(ampd); 322 free(ampd);
323 ret = clFlush(queue);
324 ret = clFinish(queue);
325 ed_time = getTime();
325 326
326 /* Write out image */ 327 /* Write out image */
327 writePGM(&opgm, "output.pgm"); 328 writePGM(&opgm, "output.pgm");
328 329
329 /* Finalizations*/ 330 /* Finalizations*/
330 ret = clFlush(queue); 331 ret = clFlush(queue);
331 ret = clFinish(queue); 332 ret = clFinish(queue);
332 ed_time = getTime();
333 ret = clReleaseKernel(hpfl); 333 ret = clReleaseKernel(hpfl);
334 ret = clReleaseKernel(trns); 334 ret = clReleaseKernel(trns);
335 ret = clReleaseKernel(sfac); 335 ret = clReleaseKernel(sfac);
336 ret = clReleaseProgram(program); 336 ret = clReleaseProgram(program);
337 ret = clReleaseMemObject(xmobj); 337 ret = clReleaseMemObject(xmobj);