Mercurial > hg > Members > yuuhi > OpenCL
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); |