基于CLFFT库的GPU快速傅里叶变换(FFT)

clFFT

clFFT是一个包含用OpenCL™编写的快速傅立叶变换(FFT)函数的软件库。除GPU设备外,该库还支持在CPU上运行,以便于调试和异构编程。

注意

clFFT需要支持OpenCL 1.2的平台/运行时。

clFFT简介

clFFT库是离散快速傅立叶变换的开源OpenCL库实现:

  1. 为计算离散FFT提供了一个快速而准确的平台。

  2. 适用于CPU或GPU后端。

  3. 支持就地或非现场转换。

  4. 支持1D,2D和3D变换,批量大小可以大于1。

  5. 支持平面(单独数组中的实际和复杂组件)和交错(实际和复杂组件作为一对连续的内存)格式。

  6. 支持尺寸长度,可以是2,3,5,7,11和13的任何功率组合。

  7. 支持单精度和双精度浮点格式。

下载

最新版本地址:
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值