Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <clFFT.h>
- #include <CL/cl.h>
- int main(){
- // Test data parameters
- size_t xRes = 8192;
- size_t yRes = 8192;
- // OpenCL parameters
- size_t clLengths[2] = {xRes, yRes};
- size_t clRealStride[2] = {1, xRes + 2};
- size_t clComplexStride[2] = {1, static_cast<size_t>(floor(static_cast<float>(xRes) / 2) + 1)};
- size_t n_pixels = yRes * (xRes + 2);
- size_t buffer_size = n_pixels * sizeof(float);
- std::cout << "Buffer size: " << buffer_size / (1024*1024) << " MB" << std::endl;
- // Initialize OpenCL
- cl_platform_id platform = 0;
- cl_device_id device = 0;
- clGetPlatformIDs(1, &platform, NULL);
- clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
- cl_context_properties props[3] = {CL_CONTEXT_PLATFORM, (cl_context_properties)platform, 0};
- cl_context ctx = clCreateContext(props, 1, &device, NULL, NULL, NULL);
- cl_command_queue queue = clCreateCommandQueue(ctx, device, 0, NULL);
- cl_mem buffer = clCreateBuffer(ctx, CL_MEM_READ_WRITE, buffer_size, NULL, NULL);
- char platform_name[128];
- clGetPlatformInfo(platform, CL_PLATFORM_NAME, sizeof(platform_name), platform_name,0);
- std::cout << "Platform: " << platform_name << std::endl;
- // Setup clFFT
- clfftSetupData fftSetup;
- clfftInitSetupData(&fftSetup);
- clfftSetup(&fftSetup);
- // Create plan for in-place real to hermitian forward FFT
- clfftPlanHandle planHandle;
- clfftCreateDefaultPlan(&planHandle, ctx, CLFFT_2D, clLengths);
- clfftSetPlanPrecision(planHandle, CLFFT_SINGLE);
- clfftSetLayout(planHandle, CLFFT_REAL, CLFFT_HERMITIAN_INTERLEAVED);
- clfftSetPlanInStride(planHandle, CLFFT_2D, clRealStride);
- clfftSetPlanOutStride(planHandle, CLFFT_2D, clComplexStride);
- clfftSetResultLocation(planHandle, CLFFT_INPLACE);
- clfftSetPlanScale(planHandle, CLFFT_FORWARD, 1.0);
- clfftBakePlan(planHandle, 1, &queue, NULL, NULL);
- //Wait until user has regisered VRAM utilization
- std::cout << "Press enter to run transform: ";
- std::cin.get();
- // Perform forward FFT
- clfftEnqueueTransform(planHandle, CLFFT_FORWARD, 1, &queue, 0, NULL, NULL, &buffer, NULL, NULL);
- clFinish(queue);
- //Wait until user has regisered VRAM utilization
- std::cout << "Press enter to clean up: ";
- std::cin.get();
- // Clean up
- clReleaseMemObject(buffer);
- clfftDestroyPlan(&planHandle);
- clfftTeardown();
- clReleaseCommandQueue(queue);
- clReleaseContext(ctx);
- //Wait until user has regisered VRAM utilization
- std::cout << "Press enter to end: ";
- std::cin.get();
- }
Advertisement
Add Comment
Please, Sign In to add comment