英特尔 IPP 函数的 C++(模板)包装器

问题描述 投票:0回答:1

我想在我的 C++ 代码中谨慎使用英特尔 IPP(集成性能原语)库函数。我可以观察到,虽然这些函数是 C 风格函数,但函数名称中存在依赖于数据类型的逻辑模式。

我们如何编写基于模板的C++包装器?

一个简单的例子是 FIR 滤波器,我们需要对“

ippsFIRSR_32f
”使用“
float
”,对“
ippsFIRSR_64f
”数据类型使用“
double
”。

有没有办法为所有 IPP 调用编写一个非常通用的 C++ 模板包装器?

c++ templates generics c++17 intel-ipp
1个回答
0
投票

您可以实现一个模板包装器,它使用

if constexpr
std::is_same
根据参数类型调度相关的 IPP 函数。

以您提到的以下两个函数为例:

IppStatus ippsFIRSR_32f(const Ipp32f* pSrc, Ipp32f* pDst, int numIters, IppsFIRSpec_32f* pSpec, const Ipp32f* pDlySrc, Ipp32f* pDlyDst, Ipp8u* pBuf);

IppStatus ippsFIRSR_64f(const Ipp64f* pSrc, Ipp64f* pDst, int numIters, IppsFIRSpec_64f* pSpec, const Ipp64f* pDlySrc, Ipp64f* pDlyDst, Ipp8u* pBuf);

你可以用以下方式包裹它们:

template <typename DATA, typename SPEC>
IppStatus ippsFIRSR_wrapper(const DATA* pSrc, DATA* pDst, int numIters, SPEC* pSpec, const DATA* pDlySrc, DATA* pDlyDst, Ipp8u* pBuf)
{
    if constexpr(std::is_same_v<DATA, Ipp32f)
        return ippsFIRSR_32f(pSrc, pDst, numIters, pSpec, pDlySrc, pDlyDst, pBuf);
    if constexpr(std::is_same_v<DATA, Ipp64f)
        return ippsFIRSR_64f(pSrc, pDst, numIters, pSpec, pDlySrc, pDlyDst, pBuf);
    return ippStsBadArgErr;
}

请注意,它会给您的代码增加一些复杂性,因此只有当您有充分的理由时我才会推荐它。默认情况下我会直接使用 IPP 函数。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.