如何创建IPP(Intel Performance primitives)C ++包装器函数?

时间:2010-08-14 09:34:51

标签: c++ wrapper intel-ipp

IPP是一个C库,有数百个这样的函数:

IppStatus ippiTranspose_8u_C1R(const Ipp8u* pSrc, int srcStep,
                               Ipp8u* pDst, int dstStep,
                               IppiSize roiSize));

为了能够以更方便,安全和一致的方式调用这些函数,我们需要为每个C函数提供C ++包装函数。例如:

void ippiTranspose(const Image<Ipp8u> &src, Rect srcRect, Image<Ipp8u> &dst, Point dstPos)
{
  if (!src.valid()) throw "Invalid src";
  if (!dst.valid()) throw "Invalid dst";
  Rect srcRoi = srcRect.isEmpty() ? src.rect() : srcRect;
  if (!src.rect().contains(srcRoi)) throw "Invalid src rect";
  Rect dstRoi = Rect(dstPos, srcRoi.size());
  if (!dst.rect().contains(dstRoi)) throw "Invalid dst rect";
  IppStatus st = ippiTranspose_8u_C1R(&src.at(srcRoi.topLeft()), src.step(), &dst.at(dstRoi.topLeft()), dst.step(), toIppiSize(srcRoi.size());
  if (st < 0) throw "ippiTranspose_8u_C1R failed";
}

有逻辑模式,可以应用于IPP中的所有功能。

如何自动生成所有这些包装器?

3 个答案:

答案 0 :(得分:2)

有一些由英特尔提供的包装器,它们只能隐藏在ipp-samples中。我正在使用最新的7.0测试版。 它们提供由perl脚本生成的C ++头文件,它们应该用作C ++包装器。问题中ippiTranspose_8u_C1R函数的“包装器”是这样的:

 static inline IppStatus ippiTranspose_C1R( const Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize) {
   return ippiTranspose_8u_C1R( pSrc, srcStep, pDst, dstStep, roiSize );
 }

这只是函数调用的较短版本。

我对C函数的优秀C ++包装器的期望是什么:

  • 将C-like params映射到C ++(对象, 模板)
  • 检查输入参数是否有效
  • 检查结果是否成功,错误或警告
  • 使用例外进行错误处理

我们需要一个真正的C ++世界解决方案,英特尔!

我目前正在开发一个程序,它会像问题中的示例一样自动生成包装器,并且事情看起来不错。

感谢Ross指出英特尔的解决方案。

答案 1 :(得分:2)

迟到总比没有好。 IPP 2017有一个扩展包,包含完整的C ++ API。预览的功能覆盖范围很小,但可能已延长了黄金版本。 https://software.intel.com/en-us/articles/intel-ipp-integration-wrappers

答案 2 :(得分:0)

查看示例,在“语言”示例部分中有ippi.hpp文件。它是C ++包装器。