我想在我的 C++ 代码中谨慎使用英特尔 IPP(集成性能原语)库函数。我可以观察到,虽然这些函数是 C 风格函数,但函数名称中存在依赖于数据类型的逻辑模式。
我们如何编写基于模板的C++包装器?
一个简单的例子是 FIR 滤波器,我们需要对“
ippsFIRSR_32f
”使用“float
”,对“ippsFIRSR_64f
”数据类型使用“double
”。
有没有办法为所有 IPP 调用编写一个非常通用的 C++ 模板包装器?
您可以实现一个模板包装器,它使用
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 函数。