我最近开始使用Intel Performance Primitives(IPP)进行图像处理.对于那些没有听说过IPP的人,可以将IPP视为MKL的模拟图像处理而不是线性代数.
我已经在OpenCV中实现了一个有点复杂的视觉系统,我想换掉一些OpenCV例程(例如卷积和FFT)来实现更快的IPP例程.我的OpenCV代码总是使用cv::Mat
图像数据结构.但是,基于IPP代码样本,似乎IPP更喜欢CIppiImage
数据结构.
我的系统在OpenCV中进行了几次图像转换,然后我想在IPP中做一些事情,然后在OpenCV中做更多的工作.这是让OpenCV和IPP很好地协同发挥的天真方式:
cv::Mat = load original image
use OpenCV to do some work on cv::Mat
write cv::Mat to file
CIppiImage = read cv::Mat from file //for IPP
use IPP to do some work on CIppiImage
write CIppiImage to file
cv::Mat = read CIppiImage from file
use OpenCV to do more work on cv::Mat
write final image to file
Run Code Online (Sandbox Code Playgroud)
但是,这有点乏味,读/写文件可能会增加整体执行时间.
我试图让它在图像处理程序中更加无缝地在OpenCV和IPP之间交替.以下是一些可以解决问题的方法:
cv::Mat
到CIppiImage
,反之亦然?cv::Mat
实现细节非常熟悉,但我不太了解CIppiImage …
我有一个音频文件,我正在遍历文件,每步取512个样本,然后通过FFT.
我将数据输出为块514浮动(使用IPP的ippsFFTFwd_RToCCS_32f_I),其中实部和虚部交错.
我的问题是,一旦我拥有这些复杂数字,我该怎么办?目前我正在为每个价值做
const float realValue = buffer[(y * 2) + 0];
const float imagValue = buffer[(y * 2) + 1];
const float value = sqrt( (realValue * realValue) + (imagValue * imagValue) );
Run Code Online (Sandbox Code Playgroud)
这提供了一些稍微有用的东西,但我更倾向于在0到1的范围内获得值.上面的问题是峰值最终会回到9或更多.这意味着事情会恶化饱和,然后光谱图的其他部分几乎不会出现,尽管当我通过试听的频谱图运行音频时它们看起来非常强大.我完全承认我不是100%确定FFT返回的数据是什么(除了它代表我传入的512个样本长块的频率值).特别是我的理解是缺乏compex数字代表什么.
任何建议和帮助将不胜感激!
编辑:只是为了澄清.我的一个大问题是,如果不知道比例是什么,返回的FFT值是没有意义的.有人能指出我制定这种规模吗?
Edit2:通过执行以下操作,我得到了非常好看的结果:
size_t count2 = 0;
size_t max2 = kFFTSize + 2;
while( count2 < max2 )
{
const float realValue = buffer[(count2) + 0];
const float imagValue = buffer[(count2) + 1];
const float value = (log10f( sqrtf( (realValue * realValue) + (imagValue * …
Run Code Online (Sandbox Code Playgroud) 我试图比较std::sort
(使用std::vector
结构)和英特尔ipp
排序的性能.
我在Intel Xeon处理器上运行此测试 model name : Intel(R) Xeon(R) CPU X5670 @ 2.93GHz
我正在排序长度为20000个元素的向量并排序200次.我尝试了2种不同的ipp
排序程序即.ippsSortDescend_64f_I
和ippsSortRadixDescend_64f_I
.在所有情况下,ipp
排序至少比5至10倍慢std::sort
.我期待ipp
较小阵列的排序可能会慢一些,但除此之外通常应该更快std::sort
.我在这里错过了什么吗?我究竟做错了什么?
std::sort
在我的所有测试用例中始终更快.
这是我的计划
#include <array>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <vector>
#include <chrono>
#include "ipp.h"
using namespace std;
const int SIZE = 2000000;
const int ITERS = 200;
//Chrono typedefs
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::microseconds microseconds;
//////////////////////////////////// std /////////////////////////////////// …
Run Code Online (Sandbox Code Playgroud) 我正在构建一个使用Intel的IPP库的C++应用程序.默认情况下,此库安装在/ opt中,并且要求您设置LD_LIBRARY_PATH
编译和运行软件(如果选择共享库链接,我会这样做).我已经修改了我configure.ac
/ Makefile.am
我在编译时不需要设置该变量,但是我仍然无法在运行时找到共享库; 我怎么做?
我正在使用-Wl, -R/path/to/libdir
标志进行编译g++
更新1:实际上我的二进制程序有一些正确链接的IPP库,但只有一个不是:
$ ldd myprogram
linux-vdso.so.1 => (0x00007fffa93ff000)
libippacem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippacem64t.so.6.0 (0x00007f22c2fa3000)
libippsem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippsem64t.so.6.0 (0x00007f22c2d20000)
libippcoreem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippcoreem64t.so.6.0 (0x00007f22c2c14000)
[...]
libiomp5.so => not found
libiomp5.so => not found
libiomp5.so => not found
Run Code Online (Sandbox Code Playgroud)
当然图书馆在那里:
$ locate libiomp5.so
/opt/intel/ipp/6.0.2.076/em64t/sharedlib/libiomp5.so
Run Code Online (Sandbox Code Playgroud) 在与英特尔IPP库链接时,某些DSP类型的工作负载似乎在英特尔x86 x86_64处理器上显示出非常显着的性能提升.
想知道ARM方面是否有类似的东西?特别是那可能适用于ARM9,ARM11和Cortex-A8/A9(不一定具有相同的性能提升水平).
最后,这个问题可能在这里可能不正确/可接受,所以mods应该留下评论并且我可以编辑它.
我一直在努力阅读IPP的许可协议,但目前尚不清楚Linux上的商业IPP许可证(售价为199美元以上的税)是否可以使用一个个人副本(但可能用于商业用途). ,或者可以将他们的申请与该图书馆联系起来并出售以获取商业利益?或者这需要不同类型的许可证?想知道在英特尔网站上的一个地方问这个问题(没有像联系销售)!
我们有相当数量的openCV代码,我们计划调查英特尔的IPP,并了解我们在应用程序中可以实现哪种加速.
英特尔有一篇关于如何链接OpenCV和IPP的白皮书. 将英特尔IPP与OpenCV一起使用 在某些情况下,链接可能是自动的,但支持的数量尚不清楚.
我们是一家门店,对任何战争故事或者在进行此类评估时需要注意的问题/问题感兴趣.
谢谢
我已经在计算机上安装了Intel IPP,我按照特定的步骤在这里找到它:
并将该库链接到我的IDE(即Eclipse),它可以完美编译,但是当我运行代码时出现此错误:
加载共享库时出错:libippcv.so.7.0:无法打开共享库文件:没有这样的文件或目录
知道可能是什么问题吗?
谢谢
我正在尝试使用 英特尔集成性能基元(IPP),我很好奇在IPP中进行2D卷积的"正确方法".
根据英特尔IPP文档,ippiConvFull
(文档)和ippiConvValid
(文档)已弃用.但是我没有在IPP中看到任何其他2D卷积例程.
我做了一些搜索,我没有找到任何替代IPP功能的2D图像卷积.
ippiConvFull
和ippiConvValid
在IPP?感叹我很遗憾地说我正在使用英特尔IPL(图像处理库)处理我正在处理的一些图像处理代码.这是我努力让我的图像正确旋转的故事.
iplRotate()采用2个移位参数xShift和yShift,它们表示在执行旋转后图像应沿x和y轴移动的距离.
问题是我无法让iplRotate将旋转的图像置于目标图像的中心.它总是偏离中心.
我最好的XSHIFT和YSHIFT什么猜测应该是这样的:
但这不起作用,我不知道还有什么办法来计算xShift和yShift.有没有人有任何关于如何使用iplRotate做我想要的建议?
最后一点信息: 我试图使用iplGetRotateShift()再次计算xShift和yShift无济于事.我想这会起作用:
iplGetRotateShift(dw / 2.0, dh / 2.0, theta, &xShift, &yShift);
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.
编辑: 我使用英特尔IPP 6.0而不是IPL重写代码,我看到相同的错误结果.我无法想象,英特尔有旋转错误在2个不同的库,所以我必须做一些错误的.
编辑: 我尝试了Dani van der Meer建议的以下(IPP)代码:
xShift = (dw - w) / 2.0;
yShift = (dh - …
Run Code Online (Sandbox Code Playgroud)