如何创建 IPP(英特尔性能原语)C++包装函数?

发布于 2024-09-14 11:38:28 字数 996 浏览 0 评论 0原文

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中的所有功能。

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

IPP is a C library, with hundreds of functions like this:

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

To be able to call these functions in a more convenient, safe and consistent way, we need a C++ wrapper function for each C function. For example:

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";
}

There are logical patterns, which can be applied to all the functions in IPP.

How to automatically generate all these wrappers?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

稳稳的幸福 2024-09-21 11:38:28

Intel 提供了某种包装器,它们很好地隐藏在仅适用于 Windows 的 ipp-samples 中。我使用的是最新的 7.0 beta 版本。
它们提供由 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 的参数映射到 C++(对象、
    模板)
  • 检查输入参数是否有效
  • 检查结果是否成功、错误或警告
  • 使用异常进行错误处理

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

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

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

There are some kind of wrappers, provided by Intel, which are well hidden in ipp-samples for windows only. I'm using the latest 7.0 beta version.
They provide C++ headers, generated by a perl script, which are supposed to be used as a C++ wrappers. The "wrapper" for the ippiTranspose_8u_C1R function in the question is this:

 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 );
 }

This is just a shorter version of the function call.

What I expect from a good C++ wrapper for a C function:

  • map C-like params to C++ (objects,
    templates)
  • check if the input params are valid
  • check if the result is a success, error or warning
  • error handling using exceptions

We need a real solution for the C++ world, Intel!

I am currently working on a program, which automatically generates wrappers like the example in the question, and the things look nice.

Thanks to Ross for pointing the solution from Intel.

作业与我同在 2024-09-21 11:38:28

迟到总比不到好。 IPP 2017 有一个带有成熟 C++ API 的扩展包。预览版的功能覆盖范围很小,但可能已扩展到黄金版本。 https://software.intel.com/en-us/文章/intel-ipp-integration-wrappers

Better late than never. IPP 2017 has an extension package with full-blown C++ API. The preview had small functionality coverage, but it may have been extend for the gold release. https://software.intel.com/en-us/articles/intel-ipp-integration-wrappers

故笙诉离歌 2024-09-21 11:38:28

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

Look at the examples there is ippi.hpp file in "language" examples section. It is C++ wrapper.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文