在 IPP 2019 中使用 Cubic 调整大小比 IPP 5.2 慢

Posted

技术标签:

【中文标题】在 IPP 2019 中使用 Cubic 调整大小比 IPP 5.2 慢【英文标题】:Resize with Cubic in IPP 2019 slower than IPP 5.2 【发布时间】:2019-09-06 07:40:54 【问题描述】:

目前我们在应用程序中使用 IPP 5.2,我尝试将其替换为带有 Nuget 包的 IPP 2019。我不明白 IPP 5.2 和 IPP 2019 之间 resize 与 CUBIC 的性能比较。

我的 CPU 是 Intel Core i7-8700k。在我的项目中。对于 IPP 5.2,版本信息为 0x3BBBF280 "6.0 Update 2 build 167.41",名称为 0x3BBBF2A8 "ippip8-6.0.dll+"。

对于 IPP 2019,版本为 x3b834230 "2019.0.4 (r62443)",名称为 0x3b834220 "ippIP AVX2 (h9)"。三次参数B设置为0.15,C设置为0.5。

调整大小与cubic的对比测试,源图像大小保持不变,调整因子不同。使用立方方法 ippiResizeCubic_16u_C1R。重复次数设置为 1000。

当源图片大小为 (30, 27) ,小图片时,IPP 5 的性能优于 IPP 2019。Comparison Test result with size (30,27)

当源图像大小为(150, 136)时,IPP 5的性能与IPP 2019几乎相同。Comparison Test result with size (150,136)

当源图像的尺寸大于 (150, 136) 时,如第三张尺寸为 (480, 517) 的图像,IPP 2019 的速度比 IPP 5 快。Comparison Test result with size (480,517)

IPL 项目中的旧 IPP 调整大小功能

ippiResize_16u_C1R((Ipp16u*)pSrc, srcSize, src->widthStep, srcRoi,
     (Ipp16u*)pDst, dst->widthStep, dstRoiSize, xFactor, yFactor, interpolation);

三次插值类型的新实现

ippiResizeGetSize_16u(srcSize, dstRoiSize, ippCubic, 0, &specSize,   &initSize);
pInitBuf = ippsMalloc_8u(initSize);
pSpec = (IppiResizeSpec_32f*)ippsMalloc_8u(specSize);
ippiResizeCubicInit_16u(srcSize, dstRoiSize, CubicParameterB, CubicParameterC, pSpec, pInitBuf);
ippiResizeGetBufferSize_8u(pSpec, dstRoiSize,1, &bufSize);
pBuffer = ippsMalloc_8u(bufSize);
ippiResizeCubic_16u_C1R((Ipp16u*)pSrc, src->widthStep, (Ipp16u*)pDst, dst->widthStep, dstOffset, dstRoiSize, ippBorderRepl, borderValue, pSpec, pBuffer);
iplFree(pInitBuf);
iplFree(pSpec);
iplFree(pBuffer);

从我得到的测试结果来看,IPP 2019 在处理较大图像时速度更快,但在调整较小图像时速度较慢。这是因为 IPP 2019 中使用了不同的三次算法吗?

对于调整较小图像 (30,27) 的大小,使用 IPP 2019 调整大小的图像质量是否优于使用 IPP 5 调整大小?

感谢您的帮助,欢迎提出任何建议!

亲切的问候,

【问题讨论】:

您必须从测量中排除内存分配(和空闲)。 您好Rotem,感谢您的建议。内存分配和空闲是resize函数的一部分,我认为旧的ippiResize_16u_C1R也包含这样的部分。 我觉得老版本不使用动态内存分配和free,不使用“sketch buffer”实现resize也不难(不能确定)...常见的用法是初始化时分配一次内存,执行多次resize,最后释放。除此之外,30x27 对​​于有效的 AVX2 优化来说太小了。 嗨@Rotem,你是对的,缓冲区大小计算是新添加的。我已经在没有内存分配和空闲的情况下对其进行了测试。但是结果和以前差不多,另外我也测试了IPP 2019 p8库,和IPP 6中的类型一样,结果也差不多 【参考方案1】:

实际上,该问题已通过最新的 IPP 2019 u5 得到确认,并针对 IPP 团队升级。由于重新设计的 IPP 大小调整功能,性能回归发生在所谓的小图像尺寸 (here。

【讨论】:

以上是关于在 IPP 2019 中使用 Cubic 调整大小比 IPP 5.2 慢的主要内容,如果未能解决你的问题,请参考以下文章

安卓cpu优化 tcp拥塞算法cubic和reno怎么选择

结合英特尔 IPP 和 TBB

使用拆分容器调整表单大小时的问题

如何在nodejs中使用sharp调整图像大小然后使用multer上传

如何在nodejs中使用sharp调整图像大小然后使用multer上传

在xamarin android中填充软输入调整大小