Как создать функции-оболочки IPP (примитивы Intel Performace) C++?

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.

Как автоматически сгенерировать все эти обертки?


person Hristo Hristov    schedule 14.08.2010    source источник


Ответы (3)


Есть какие-то обертки от Intel, которые хорошо спрятаны в ipp-samples только для windows. Я использую последнюю бета-версию 7.0. Они предоставляют заголовки C++, сгенерированные сценарием perl, которые предполагается использовать в качестве оболочек 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++, Intel!

В настоящее время я работаю над программой, которая автоматически генерирует обертки, такие как пример в вопросе, и все выглядит хорошо.

Спасибо Россу за указание на решение от Intel.

person Hristo Hristov    schedule 26.08.2010
comment
Не ожидайте слишком многого от Intel. - person Ross; 26.08.2010
comment
Почему нет? IPP, OpenCV, Intel TBB — вот причины ожидать большего добра :) - person Hristo Hristov; 27.08.2010

Лучше поздно, чем никогда. IPP 2017 имеет пакет расширения с полноценным C++ API. Предварительная версия имела небольшой охват функциональности, но, возможно, она была расширена для золотой версии. https://software.intel.com/en-us/articles/intel-ipp-integration-wrappers

person LupusTR3    schedule 25.04.2016

Посмотрите на примеры, в разделе «язык» есть файл ippi.hpp. Это оболочка C++.

person Ross    schedule 25.08.2010
comment
Также в примерах версии beta 7.0 более полная реализация. - person Ross; 25.08.2010
comment
Спасибо, я опубликую свой комментарий как новый ответ, потому что исходный код нельзя размещать в комментарии. - person Hristo Hristov; 26.08.2010
comment
Хм, у меня установлен IPP, но я не могу найти ippi.hpp в моих каталогах ipp-samples.7.1.0.011 или /opt/intel. Однако у меня есть ipp.h и другие заголовки, отличные от C++. - person solvingPuzzles; 20.11.2012