基于oneMKL和开源FFTW3对于二维实数到复数的FFT进行加速与优化

1、题目描述
 

本次比赛为命题形式,题目要求如下:

(1)、使用oneMKl工具生成2048*2048随机单精度实数;

(2)、根据产生的随机数据作为输入,实现两维 Real to complex FFT 参考代码;

(3)、根据产生的随机数据作为输入, 调用 oneMKL API 计算两维 Real to complex FFT;

(4)、 结果正确性验证;

(5)、平均性能数据比对;

oneMKL介绍

oneMKL是英特尔(Intel)为加速数学库开发的一个跨平台的程序库。它是英特尔数学核心函数库(Intel Math Kernel Library,简称MKL)的一部分。oneMKL旨在提供高效的数学函数和算法,以帮助开发者在各种硬件架构上实现更高的性能。

oneMKL涵盖了多个数学领域,包括线性代数、傅里叶变换、随机数生成等。它提供了丰富的函数接口,方便开发者在应用程序中使用这些数学函数,从而加速计算过程。oneMKL支持多种编程语言,如C/C++、Fortran和Python,可以在各种操作系统和硬件平台上使用。

通过使用oneMKL,开发者可以充分利用英特尔处理器的优势,如向量化指令集和多核并行处理能力,从而提高应用程序的性能和效率。它可以在科学计算、机器学习、深度学习等领域中发挥重要作用,帮助开发者快速实现高性能的数值计算任务。

总之,oneMKL是一个用于加速数学库的跨平台程序库,它为开发者提供了高效的数学函数和算法,以帮助他们在各种硬件平台上实现更高的性能和效率。


产生随机数和FFTW方案

//Random
    VSLStreamStatePtr stream;
    vslNewStream(&stream,VSL_BRNG_MT19937,1);
    vsRngUniform(VSL_RNG_METHOD_UNIFORM_STD,stream,N*N,array_in,0.0f,1.0f);

//FFTW
    fftwf_complex *fftw_out=(fftwf_complex *)fftwf_malloc(sizeof(fftwf_complex)*N*(N/2+1));
    fftwf_plan status_fftwf=fftwf_plan_dft_r2c_2d(N,N,array_in,fftw_out,FFTW_MEASURE);
    clock_t t0=clock(); 
    fftwf_execute(status_fftwf);
    clock_t t1=clock();
    double time_taken=((double)(t1-t0)/CLOCKS_PER_SEC);
    fprintf(stderr,"1 times FFT (FFTW3) time taken is %f s\n",time_taken);

oneMKL

MKL_LONG rs[3]={0,N,1};
    MKL_LONG cs[3]={0,N/2+1,1};
    MKL_Complex8 *mkl_out=(MKL_Complex8 *)malloc(sizeof(MKL_Complex8)*N*(N/2+1));
    DFTI_DESCRIPTOR_HANDLE descriptor;
    MKL_LONG sizeN[2]={N,N};
    DftiCreateDescriptor(&descriptor,DFTI_SINGLE,DFTI_REAL,2,sizeN);
    DftiSetValue(descriptor,DFTI_PLACEMENT,DFTI_NOT_INPLACE);
    DftiSetValue(descriptor,DFTI_CONJUGATE_EVEN_STORAGE,DFTI_COMPLEX_COMPLEX);
    DftiSetValue(descriptor,DFTI_INPUT_STRIDES,rs);
    DftiSetValue(descriptor,DFTI_OUTPUT_STRIDES,cs);
    DftiCommitDescriptor(descriptor);
    clock_t t2=clock(); 
    DftiComputeForward(descriptor,array_in,mkl_out);
    clock_t t3=clock();
    double time_taken1=((double)(t3-t2)/CLOCKS_PER_SEC);
    fprintf(stderr,"1 times FFT (MKL  ) time taken is %f s\n",time_taken1);

oneMKL和FFTW3做比较

//Compare
    float EPS=0.00001;//1e-5
    float residual_r=0;
    float residual_i=0;
    int result=0;
    for(int i=0;i<(N/2+1)*N;i++)
    {
        residual_r=(float)fabs(mkl_out[i].real-fftw_out[i][0]);
        residual_i=(float)fabs(mkl_out[i].imag-fftw_out[i][1]);
        if(residual_r>EPS || residual_i>EPS) result=1;
    }

    if(result==0)   fprintf(stderr,"The result was correct(^ ^)\n");
    else    fprintf(stderr,"The result was wrong(* *)\n");

结果

1 times FFT (FFTW3) time taken is 0.015783 s
1 times FFT (MKL  ) time taken is 0.017072 s
1000 times Avarage FFT (FFTW3) time taken is 0.012243 s
1000 times Avarage FFT (MKL  ) time taken is 0.013808 s
The result was correct(^ ^)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值