做软件的网站php,深圳网站制作建设哪家专业,响应式手机网站,dw制作一个手机网站模板下载地址目录 前言1、大赛要求2、oneMKL介绍3、准备 oneMKL基本使用1、下载#xff1a;2、安装#xff1a;3、初始化oneMKL环境#xff1a;4、编译代码5、运行 所需的头文件使用oneMKL工具生成随机数使用fftw3计算FFT调用oneMKL API加速计算FFT对比两种方法的准确性输出结果结束语 前… 目录 前言1、大赛要求2、oneMKL介绍3、准备 oneMKL基本使用1、下载2、安装3、初始化oneMKL环境4、编译代码5、运行 所需的头文件使用oneMKL工具生成随机数使用fftw3计算FFT调用oneMKL API加速计算FFT对比两种方法的准确性输出结果结束语 前言
1、大赛要求
本次比赛为命题形式题目要求如下
使用oneMKl工具生成2048*2048随机单精度实数使用FFT算法实现实数到复数的快速傅里叶变换使用oneMKL加速计算实数到复数的快速傅里叶变换对比上面两种快速傅里叶变换的精度、性能
2、oneMKL介绍
oneMKLoneAPI Math Kernel Library是oneAPI包含的一种数学工具能对各种数据工程问题实现加速与优化。 oneAPI官网oneAPI oneMKL官网oneMKL oenMKL对C语言的API文档oneMKL—C语言参考文档
3、准备
Ubuntu系统C基础oneMKL
由于题目比较简单不需要很复杂的编译方法上手简单。使用onelMKL工具的话你的电脑的CPU最好是intel的。而且推荐使用linux系统加速效果明显。 oneMKL基本使用
oneMKL下载网址oneMKL下载
注意要使用离线版本安装如果你使用的是为window的话使用在线版本的方式安装。
1、下载
一定要注意下载的是oneMKl_baseKit不能仅仅下载MKL工具包
wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/992857b9-624c-45de-9701-f6445d845359/l_BaseKit_p_2023.2.0.49397_offline.sh2、安装
sudo sh ./l_BaseKit_p_2023.2.0.49397_offline.sh默认安装目录/opt/intel/oneapi
3、初始化oneMKL环境
source /opt/intel/oneapi/setvars.sh可以将这条命令放到~/bashrc文件内并激活这样不用每次启动一个终端都初始化了。
4、编译代码
icpx -qmkl my.cpp -o my.out注意其中的-qmkl是比较方便的也是不容易出错的动态库链接参数它是把关于oneMKL的所有动态库都链上了懒人必备。
5、运行
./my.out直接把编译好的运行就可。 所需的头文件
#include chrono // 计算程序运行时间
#include iostream
#include stdio.h
#include math.h
#include mkl.h // onemkl工具包
#include fftw3.h // fftw3onemkl自带使用fftw3来对比经过oneMKL加速过的fft
using namespace std;使用oneMKL工具生成随机数
#define ROW 2048
#define COL 2048
float *data (float *)malloc((ROW * COL) * sizeof(float));
VSLStreamStatePtr stream;
vslNewStream(stream, VSL_BRNG_MT19937, 42); // 42是随机数种子
vsRngUniform(VSL_RNG_METHOD_UNIFORM_STD, stream, ROW * COL, data, 0.0f, 1.0f); // 生成0到1之间的随机数
vslDeleteStream(stream); 使用fftw3计算FFT
void fftw3(float *data, MKL_Complex8 *x)
{fftwf_plan r2c;r2c fftwf_plan_dft_r2c_2d(ROW, COL, data, (fftwf_complex *)x, FFTW_ESTIMATE);fftwf_execute(r2c);fftwf_destroy_plan(r2c);
}// 开辟内存空间存储普通FFT计算的结果
MKL_Complex8 *x (MKL_Complex8 *)malloc(ROW * (COL / 2 1) * 2 * sizeof(float));
fftw3(data, x);注意给x开的空间是ROW * (COL / 2 1) * 2 * sizeof(float)
调用oneMKL API加速计算FFT
void r2c_oneMKL(float *data, MKL_Complex8 *y)
{MKL_LONG status;MKL_LONG dim_sizes[2] {ROW, COL};DFTI_DESCRIPTOR_HANDLE handle;status DftiCreateDescriptor(handle, DFTI_SINGLE, DFTI_REAL, 2, dim_sizes);status DftiSetValue(handle, DFTI_PLACEMENT, DFTI_NOT_INPLACE); // 不覆盖datastatus DftiSetValue(handle, DFTI_CONJUGATE_EVEN_STORAGE, DFTI_COMPLEX_COMPLEX);status DftiCommitDescriptor(handle);status DftiComputeForward(handle, data, y);DftiFreeDescriptor(handle);
}// 开辟空间存储oneMKL API FFT计算的结果
MKL_Complex8 *y (MKL_Complex8 *)malloc(ROW * COL * 2 * sizeof(float));
r2c_oneMKL(data, y);注意要多给y多开点内存空间乘以2是因为有实部和虚部 对比两种方法的准确性
对比的时候要对比实部和虚部
void compare_results(MKL_Complex8 *x, MKL_Complex8 *y)
{bool is_sametrue;// 实部对比for (int i 0; i ROW; i){for (int j 0; j (COL / 2 1); j){// cout x[i*(ROW/21)j].real ;// cout y[i*(COL)j].real ;// 实部一个一个比较if (x[i * (COL / 2 1) j].real - y[i * (COL) j].real 1e-6){is_samefalse;break;}}}if (is_same){cout实部结果正确endl;}else{cout实部结果不正确endl;}// 虚部对比is_sametrue;for (int i 0; i ROW; i){for (int j 0; j (COL / 2 1); j){// 虚部一个一个比较if (x[i * (COL / 2 1) j].imag - y[i * (COL) j].imag 1e-6){is_samefalse;break;}}}if (is_same){cout虚部结果正确endl;}else{cout虚部结果不正确endl;}
}输出结果 结束语
本次大赛的题目比较基础对非计算机专业的工科生很友好。本人是地质专业由于要经常进行地震数据处理、地震数据解释等对傅里叶变换的需要也很大oneMKl工具计算速度快对大型地震数据的复杂计算有着不可替代的性能优势。