OneAPI 黑客松记录 & OneMKL库初体验

背景介绍 & 问题简介

参加了23年7月的OneAPI黑客松。
虽然之前学习过一些CV和深度学习方向的基础工作,但对图像处理与AI训练加速这块确实了解的不太多,对OneAPI也仅限于耳闻,这是第一次上手体验。
这次的赛题主要围绕着OneAPI的数学库OneMKL进行,赛题内容是调用OneMKL数学库的相关接口,实现2D R2C FFT变换,并和参考代码进行正确性与速度两方面的对比。
赛题难度不会很高,但需要一定时间配置环境,还有就是翻OneAPI文档和examples。

环境配置

OneAPI官方网站提供了各种可用的安装方式,本地、Conda、Docker基本都有,我先是用Conda在本地配了环境,Conda配置的具体命令可参见此处
但配的环境并没用上,因为后续发现Intel 提供的DevCloud环境非常好用,高性能CPU、冗余量极大的内存、自带的OneApi环境与示例代码,对初学者也十分友好,于是决定在DevCloud环境中完成赛题与测试性能。
DevCloud环境的内存

DevCloud甚至提供了一系列循序渐进的OneApi入门教程,如果想从零开始学OneAPI的话,是非常合适的一个选择。
DevCloud的示例代码

随机数生成

参考OneAPI 文档中的rng使用样例,使用philox4x32x10生成伪随机数。

      oneapi::mkl::rng::philox4x32x10 engine(queue, seed);
      oneapi::mkl::rng::gaussian<float, oneapi::mkl::rng::gaussian_method::icdf> distr;
      auto event = oneapi::mkl::rng::generate(distr, engine, n, r2cdata.data());
      event.wait();

OneMKL FFT 接口

DevCloud提供的示例代码就有OneMKL的基础使用方式,主办方也有提供必要的说明文档,再加上自己当初学的C++还没忘光,所以没遇上太多困难。
创建Descriptor:

    status = DftiCreateDescriptor(&my_desc_handle, DFTI_SINGLE, DFTI_REAL, 2, dim_sizes);
    status = DftiSetValue(my_desc_handle, DFTI_PLACEMENT, DFTI_NOT_INPLACE);
    status = DftiCommitDescriptor(my_desc_handle);

执行2D R2C FFT,结果存储在result1.data()中。

    status = DftiComputeForward(my_desc_handle, r2cdata.data(), result1.data());

性能对比

参考代码选用了知名的开源FFT库FFTW3,使用chrono库进行微妙级计时,允许1000次,对比OneMKL和FFTW3在相同条件下的计算效率与正确性。
一些FFTW3的注意事项:

  • 仅对FFT运算过程进行计时,OneMKL 创建Descriptor、FFTW3创建plan不在对比范围内,这是可以理解的;
  • 使用了FFTW3的fftwf_plan_dft_r2c_2d()函数,参数需要选择FFTW_MEASURE而非默认的FFTW_ESTIMATE以获取最高效的计算方案;
  • 赛题要求使用单精度浮点数,FFTW3默认为double,无论是编译还是调用都需作相应调整。
  • FFTW3与OneMKL分别使用fftw_comlex与std::complex类型,对比时需要进行类型转换。
    fftwf_plan plan = fftwf_plan_dft_r2c_2d(n1, n2, r2cdata.data(), result2.data(), FFTW_MEASURE);
    fftwf_execute(plan);

得到结果后,需要确认正确性与运行耗时。
我将两种方法的变换结果按位求差的绝对值,得到最终误差。因为是R2C FFT,变换结果存在对称性,OneMKL的FFT和FFTW3的FFT对无需计算的位数都进行了补0处理,计算误差时可以省去这些位数,不会影响结果正确性。
最终的耗时结果如下:
在这里插入图片描述
在实验环境下,OneMKL的FFT运算效率大概是FFTW3的2.6倍,这已经十分可观了。但我在DevCloud环境下的测试结果似乎仍未达到OneMKL的极限,其他参赛组的运算速率最高能达到3倍以上,说明可以继续优化。
顺带一提,OneApi本身也提供经过OneMKL加速的FFTW3算法实现,效率和OneMKL的FFT接近。

收获

了解并上手操作了OneApi,主要集中在OneMKL库。虽然时间较短,了解得不是很深入,但已经体验到了OneApi的高效与强大。后续应该会继续体验一下OneApi在深度学习与图像处理方面的应用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值