东方杯Intel OneAPI 黑客松参赛记录

通过同学介绍参加了23年度由东方地球物理公司举办的东方杯 Intel OneAPI黑客松比赛。下面分享一下此次的参赛过程和感受。

背景介绍 & 问题简介

oneAPI 就是这样一个跨架构编程模型,它在构建各种创新解决方案时拥有巨大潜力。利用 oneMKL(oneAPI Math Kernel Library)等工具对数学工程问题进行加速与优化。

这次的赛题主要围绕着OneAPI的数学库OneMKL进行,赛题内容是调用OneMKL数学库的相关接口,实现 FFT变换,并和开源的fftw3库进行正确性与速度两方面的对比。

测试流程

1.下载64位fftw3并解压:FFTW Installation on Windows

2.启动VS 2022 -X64 Native Tools Commond Prompt for VS 2022

3.通过cd命令跳转到fftw3库文件解压目录

4.输入如下命令生成对应的lib库:

        lib /machine:x64 /def:libfftw3-3.def

        lib /machine:x64 /def:libfftw3l-3.def

        lib /machine:x64 /def:libfftw3f-3.def

5.在编译器VS2022社区版中安装Windows版本的Get Intel® oneAPI Math Kernel Library (oneMKL):Get Intel® oneAPI Math Kernel Library

6.新建项目:HKS_Project

7.右键项目进入“属性”,依次修改可执行文件目录、包含目录、库目录

8.在“属性”、“链接器”中点击输入,修改以下附加依赖项

        mkl_intel_ilp64.lib

        mkl_intel_thread.lib

        mkl_core.lib

        libiomp5md.lib

9.在“属性”中,选择 C/C++ 下“常规”,在附加包含目录中添加 fftw64 的路径

10.在“属性”、“链接器”中点击输入,添加附加依赖项(步骤4生成的lib文件):

        libfftw3-3.lib

        libfftw3f-3.lib

        libfftw3l-3.lib

11.将 fftw64 中的libfftw3-3.dll 、libfftw3f-3.dll、libfftw3l-3.dll文件复制到当前项目中

12.在VS 2022编译器中运行项目:“开始执行(不调试)

部分代码展示

  1. (1)随机数生成器函数
// 创建随机数生成器函数
void random_numbers(float* standardized_numbers, const MKL_INT scale) {
    VSLStreamStatePtr stream;
    vslNewStream(&stream, VSL_BRNG_MT19937, 777); 
    vsRngUniform(VSL_RNG_METHOD_UNIFORM_STD_ACCURATE, stream, scale, standardized_numbers, 0.0, 1.0);
    vslDeleteStream(&stream);
}

(2)onemkl_fft执行傅里叶变换

    DFTI_DESCRIPTOR_HANDLE hand = NULL;
    for (int i = 0; i < 1000; i++) {
        char version[DFTI_VERSION_LENGTH];
        DftiGetValue(0, DFTI_VERSION, version);
        status = DftiCreateDescriptor(&hand, DFTI_SINGLE, DFTI_REAL, 2, N);
        status = DftiSetValue(hand, DFTI_PLACEMENT, DFTI_NOT_INPLACE);
        status = DftiSetValue(hand, DFTI_CONJUGATE_EVEN_STORAGE,
            DFTI_COMPLEX_COMPLEX);
        status = DftiSetValue(hand, DFTI_INPUT_STRIDES, rs);
        status = DftiSetValue(hand, DFTI_OUTPUT_STRIDES, cs);
        status = DftiCommitDescriptor(hand);
        status = DftiComputeForward(hand, real_data, cmplx_data);
    }

(3)fftw3执行傅里叶变换

    // fftw3执行傅里叶变换
    for (int i = 0; i < 1000; i++) {
        plan = fftwf_plan_dft_r2c_2d(NUM3, NUM3, in, out, FFTW_ESTIMATE);
        fftwf_execute(plan);
    }

(4)结果正确性检验

    // 结果正确性检验
    for (int i = 0; i < (NUM3 / 2 + 1) * NUM3;++i) { 
        if (abs(cmplx_data[i].real - out[i][0])> variable1) {
            std::cout << "out[" << i << "]:" << abs(cmplx_data[i].real - out[i][0]) << std::endl;
            std::cout << "out[" << i << "]:" << "结果不正确" << std::endl;
        }    
    }

总结

通过此次比赛,了解并上手操作OneMKL库,虽然只是进行一些简单的FFT变换,但是经体验到了OneApi强大之处。后续会继续探索OneApi的其他领域的用途。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值