一:团队名称
西南石油大学:龙井湖
二:问题描述
当今时代信息飞速发展,图像作为传输方便,信息量大的一种数据载体得到人们越来越多的关注和使用。由于图像采集时受环境和采集仪器内部电路的影响,往往拍摄的图像除了人们想要的图像信息,还有大量的噪声信息,这些噪声信息会干扰后续图像加工的结果,比如图像的拼接、融合、识别等等,因此图像去噪时所有图像处理的前提,而去噪效果的好坏会直接影响后续图像处理的结果。在这些传统降噪算法中,最经典而强大的莫过于 BM3D 了。
三:解决方案
Ⅰ:方案简述
我们首先使用Intel® oneAPI Base Toolkit里的VTune™ Profiler对代码进行分析。然后对整个代码流程有个大致的优化步骤
可以看到对于整个BM3D算法,函数precompute_BM占用了绝大多数的时间我们主要对此热点函数进行了异构移植的优化并采用并行加速算法。
Ⅱ:部分代码移植方法
1:替换数据结构
对于整个函数我们使用usm统一共享内存申请空间 代替了原有代码的vector。usm基于指针,我们更加熟悉。使用usm更加简化了我们的工作同时意味着主机上的usm返回的指针都是设备上的有效指针我们并不需要手动的转换主机指针来获得设备指针。
并且对于patch_table我们使用一维替代原有的二维,这可以减少内存访问、延迟线性内存访问,提高数据存储的效率
2:GPU计算初始化
对于整个热点函数 我们使用了合并循环层次为一个工作组的方法通过使用多个维度重现原代码的多个循环层次如:
源代码中计算补丁距离的部分中 计算平方距离的部分我们将代码提出到循环外单独计算使用(height - 2 * nhw )* (width - 2 * nhw)个工作组每个工作组开辟nhw个工作项来进行计算
3:GPU移植
对于块匹配部分我们更改原来的vector和pair的数据结构为两个一维数组来存放使得访存更加连续将预计算块匹配提交到gpu上分层次并行,取得了不错的加速效果。
同时我们通过观察代码和查找论文发现块间距离排序这一部分是属于冗余,我们将它去除了。
四:图像效果展示
左图为原始图像 右图为加噪声值20之后的图像 我们使用BM3D算法进行去噪后得到数据
我们对于原始代码去噪后的数据发现去噪效果差异不大
五:加速效果展示
上图为加速之前的时间 下图为加速之后的时间。最终达到了约12x的加速比