背景介绍 & 问题简介
参加了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甚至提供了一系列循序渐进的OneApi入门教程,如果想从零开始学OneAPI的话,是非常合适的一个选择。
随机数生成
参考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在深度学习与图像处理方面的应用。