赞
踩
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是一个用于加速数学库的跨平台程序库,它为开发者提供了高效的数学函数和算法,以帮助他们在各种硬件平台上实现更高的性能和效率。
- //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);
- 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);
- //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(^ ^)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。