2010-08-14 182 views
1

IPP是一个C库,数以百计的功能是这样的:如何创建IPP(Intel Performace原语)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中的所有功能。

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

回答

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 PARAMS到C++(对象, 模板)
  • 检查输入PARAMS有效
  • 检查如果结果是成功的,错误或警告
  • 使用错误处理异常

我们需要重新面向C++世界的英特尔解决方案!

我目前正在研究一个程序,它会自动生成像问题中的示例一样的包装,并且这些东西看起来不错。

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

+0

不要指望英特尔太多。 – Ross 2010-08-26 18:28:41

+0

为什么不呢? IPP,OpenCV,英特尔TBB - 这些是期待更多善良的理由:) – 2010-08-27 07:18:13

0

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

+0

另外,在beta 7.0版本的例子中有更完整的实现。 – Ross 2010-08-25 09:29:07

+0

谢谢,我将发表我的评论作为新的答案,因为源代码不能发布在评论中。 – 2010-08-26 06:35:11

+0

嗯,我已经安装了IPP,但我似乎无法在我的'ipp-samples.7.1.0.011'或'/ opt/intel'目录中找到'ippi.hpp'。不过,我有'ipp.h'和其他非C++头文件。 – solvingPuzzles 2012-11-20 02:27:55