clFFT
clFFT是一个包含用OpenCL™编写的快速傅立叶变换(FFT)函数的软件库。除GPU设备外,该库还支持在CPU上运行,以便于调试和异构编程。
注意
clFFT需要支持OpenCL 1.2的平台/运行时。
clFFT简介
clFFT库是离散快速傅立叶变换的开源OpenCL库实现:
-
为计算离散FFT提供了一个快速而准确的平台。
-
适用于CPU或GPU后端。
-
支持就地或非现场转换。
-
支持1D,2D和3D变换,批量大小可以大于1。
-
支持平面(单独数组中的实际和复杂组件)和交错(实际和复杂组件作为一对连续的内存)格式。
-
支持尺寸长度,可以是2,3,5,7,11和13的任何功率组合。
-
支持单精度和双精度浮点格式。
下载
最新版本地址:
https://github.com/clMathLibraries/clFFT/releases/tag/v2.12.2
里面有三个示例代码,包含一维、二维、三维的FFT实现。
当然也同时需要配置好 OpenCL 环境,将头文件和库文件加入工程中去。
另外OpenCL下载地址:
https://software.intel.com/ru-ru/opencl-sdk
也可以查看 clFFT 库的文档:
http://clmathlibraries.github.io/clFFT/index.html
例子:
以下简单示例演示如何使用clFFT计算简单的1D正向变换。
#include <stdlib.h>
/* No need to explicitely include the OpenCL headers */
#include <clFFT.h>
int main( void )
{
cl_int err;
cl_platform_id platform = 0;
cl_device_id device = 0;
cl_context_properties props[3] = { CL_CONTEXT_PLATFORM, 0, 0 };
cl_context ctx = 0;
cl_command_queue queue = 0;
cl_mem bufX;
float *X;
cl_event event = NULL;
int ret = 0;
size_t N = 16;
/* FFT library realted declarations */
clfftPlanHandle planHandle;
clfftDim dim = CLFFT_1D;
size_t clLengths[1] = {N};
/* Setup OpenCL environment. */
err = clGetPlatformIDs( 1, &platform, NULL );
err = clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL );
props[1] = (cl_context_properties)platform;
ctx = clCreateContext( props, 1, &device, NULL, NULL, &err );
queue = clCreateCommandQueue( ctx, device, 0, &err );
/* Setup clFFT. */
clfftSetupData fftSetup;
err = clfftInitSetupData(&fftSetup);
err = clfftSetup(&fftSetup);
/* Allocate host & initialize data. */
/* Only allocation shown for simplicity. */
X = (float *)malloc(N * 2 * sizeof(*X));
/* Prepare OpenCL memory objects and place data inside them. */
bufX = clCreateBuffer( ctx, CL_MEM_READ_WRITE, N * 2 * sizeof(*X), NULL, &err );
err = clEnqueueWriteBuffer( queue, bufX, CL_TRUE, 0,
N * 2 * sizeof( *X ), X, 0, NULL, NULL );
/* Create a default plan for a complex FFT. */
err = clfftCreateDefaultPlan(&planHandle, ctx, dim, clLengths);
/* Set plan parameters. */
err = clfftSetPlanPrecision(planHandle, CLFFT_SINGLE);
err = clfftSetLayout(planHandle, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED);
err = clfftSetResultLocation(planHandle, CLFFT_INPLACE);
/* Bake the plan. */
err = clfftBakePlan(planHandle, 1, &queue, NULL, NULL);
/* Execute the plan. */
err = clfftEnqueueTransform(planHandle, CLFFT_FORWARD, 1, &queue, 0, NULL, NULL, &bufX, NULL, NULL);
/* Wait for calculations to be finished. */
err = clFinish(queue);
/* Fetch results of calculations. */
err = clEnqueueReadBuffer( queue, bufX, CL_TRUE, 0, N * 2 * sizeof( *X ), X, 0, NULL, NULL );
/* Release OpenCL memory objects. */
clReleaseMemObject( bufX );
free(X);
/* Release the plan. */
err = clfftDestroyPlan( &planHandle );
/* Release clFFT library. */
clfftTeardown( );
/* Release OpenCL working objects. */
clReleaseCommandQueue( queue );
clReleaseContext( ctx );
return ret;
}
此外,附上我当时的代码:
https://download.csdn.net/download/cao_jie_xin/11239422
另外基于cuFFT库的傅里叶变换(FFT)链接如下:
https://blog.csdn.net/cao_jie_xin/article/details/90644337