2008年4月7日星期一

介绍英特尔的优化库IPP(上)

英特尔不仅在硬件开发上独占鳌头,在与硬件结合的软件上也有相当的实力,更是其死对头AMD所望尘莫及的。著名的软件有英特尔的C/C++语言编译器,以及系列优化库软件。这里谈一下优化库IPP。

IPP全名是Integrated Performance Primitives,有个中文译名,叫英特尔® 群集工具集, 名字颇为拗口,但其功能非常直接:提供程序处理中的优化功能。编程的时候,如果在一些很关键且耗用CPU的处理中进行优化处理,可以大幅度提高程序性能和 缩短执行时间。这些优化,除了对程序进行合理安排之外,就得使用一些高性能的汇编指令了。不过这么一来,程序变得复杂,而且难以维护,还有就是不同的 CPU(甚至包括尚未出现的)的对应也会成问题。对此,英特尔的IPP给出了比较完善的回答。

[更多:]


IPP可以从英特尔网站下载。其Linux版本是免费的,而Windows版可以免费得到评估版,如果你要使用Windows版作商业用途,则应该付199美元。

这里简单介绍一下IPP的用法。刚打开一个IPP的头文件,会觉得里面的函数名如同天书一般的复杂。其实根据其文档看,名字还是有规律的。

一般的IPP函数名如下:

ipp<data-domain><name>_<datatype>[_<descriptor>](<arguments> ) ;

这里的data-domain所谓的域,指的是该IPP函数所属的功能范围。s(signals)代表一维的信号处理;i(images/video)代表二维图像处理;m(matrices)代表矩阵处理。

datatype数据类型的定义是位数加上位解释组成。位数有<1|8|16|32|64>,位解释则有[c]。

这里u是无符号,s是有符号,f是浮点数,c是复数。

descriptor是描述符,描述要操作的数据。
A表示数据有Alpha色。
C加数字n表明图像数据有几个颜色频道,1|2|3|4。
I表示操作仅在此数据内存的范围内进行,不需要多余的内存空间。
R表示需要指定ROI即圈选范围。

以此来看最常用的申请内存的函数ippiMalloc。由开头的ippi可以知道这是用于二维图像的,所以需要指定宽和高,还有一个用于返回逐行字节长度的指针。

Ipp* ippiMalloc_(int widthPixels, int heightPixels, int* pStepBytes);

看说明它有以下这些修饰符:
8u_C1 16u_C1 16s_C1 32s_C1 32f_C1 32sc_C1 32fc_C1
8u_C2 16u_C2 16s_C2 32s_C2 32f_C2 32sc_C2 32fc_C2
8u_C3 16u_C3 16s_C3 32s_C3 32f_C3 32sc_C3 32fc_C3
8u_C4 16u_C4 16s_C4 32s_C4 32f_C4 32sc_C4 32fc_C4
8u_AC4 16u_AC4 16s_AC4 32s_AC4 32f_AC4 32sc_AC4 32fc_AC4


因此就可以根据自己的不同需要来调用不同的ippiMalloc函数了。

最后给一个小例子。

HANDLE hFile;
DWORD szFile, dwBytes;
Ipp8u *bmpData, *data;

hFile = CreateFile("TEST.BMP", GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d)n", GetLastError());
return;
}
szFile = GetFileSize(hFile, NULL);
data = (Ipp8u *)ippMalloc((int)szFile);
ReadFile(hFile, data, szFile, &dwBytes, NULL);
CloseHandle(hFile);

IppiSize iSize;
BITMAPINFOHEADER *header;
int lineStep;

header = (BITMAPINFOHEADER *)(data + sizeof(BITMAPFILEHEADER));
bmpData = data + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
iSize.width = header->biWidth;
iSize.height = header->biHeight;
lineStep = ((header->biWidth * 24 + 31) / 32) * 4;
ippiMirror_8u_C3IR(bmpData, lineStep, iSize, ippAxsHorizontal);

hFile = CreateFile("TEST1.BMP", GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d)n", GetLastError());
ippFree(data);
return;
}
WriteFile(hFile, data, szFile, &dwBytes, NULL);
CloseHandle(hFile);

ippFree(data);


这是段完整的程序,它所做的是读入一个RGB24位的BMP文件TEST.BMP,然后将图像进行水平翻转,写到一个叫TEST1.BMP的文件里。(这 里故意使用Win32的文件处理函数,喜欢Unix风格的就自己修改吧)用到的IPP函数是ippiMalloc,ippFree, ippiMirror_8u_C3IR。

1 条评论:

WANGHU 说...

评论源自: 逸立
咋一见“英特尔”我还以为这位葛格要开唱《国际歌》呢···
06-04-24 @ 17:59

评论源自: casi
我有一种感觉叫做"晕"
06-04-25 @ 04:34

评论源自: 崴跛司机
代码优化,这可是一个狠大的题目哈
俺们写游戏engine,很大一部分工作就是做这个滴:针对目标平台作优化,尽可能把目标平台的硬件性能使用到极限,榨出每一滴“汁”,8过随着目标平台越来越复杂,大家也有点力不从心的感觉鸟
在俺们行业,目前为止,大家追求的终极目标就是:在保证足够帧率的情况下,进行尽可能多的计算(Physics, AI, Networkworking, etc.),提供更加高的分辨率,可以表现更加多图形元素,更加多的光影效果,更加逼真的音视频播放,等等等等
06-04-25 @ 11:54

评论源自: 逸立
王糊!!躲哪儿去了?!出来!回帖子!!!
06-04-25 @ 22:07

评论源自: WANGHU
逸立:“英特尔”我还以为这位葛格要开唱《国际歌》呢···王糊!!躲哪儿去了?!出来!回帖子!!!
---------------------------------------------
啧啧,老李在瓢虫那里呆的时间太长聊,怪不得FF说你像呢。 :p
06-04-26 @ 06:59

评论源自: WANGHU
casi:我有一种感觉叫做"晕"
----------------------------
是啊,做挨踢这行的一个很重要的开发平台奏是“晕”:晕酒屋,晕酒吧,晕迷,晕二钱,晕叉疲。
06-04-26 @ 07:01

评论源自: WANGHU
崴跛司机:代码优化,这可是一个狠大的题目哈
-------------------------------------------
偶怎么敢惹这么大的题目?不过是拿其中很小很小的一部分蜻蜓点水罢聊。
06-04-26 @ 07:02

评论源自: casi
说到这里要请教: 我特讨厌XP, 但是新硬件在2千以前又不支持; 我想用些老游戏, 2千以后又不支持, 怎摸半说?

BTW, 据说2千漏洞相对少些?
06-04-26 @ 19:06

评论源自: WANGHU
回casi,你可以在XP上安装虚拟机,就可以拥有自己想要的系统了,虽然速度慢,但老游戏应该是没问题的。

2000的版本是5.0,XP的版本是5.1,可见应该是XP补了不少2000的漏洞。
06-04-26 @ 19:44

评论源自: casi
虚拟鸡是怎么回事?

机器是P4HT, 好象是风扇很吵, 有没有办法能安静些?
06-04-27 @ 18:00

评论源自: WANGHU
虚拟鸡是Virtual PC。可以允许你在XP上建立虚拟的OS,共享现有的硬件。P4HT应该没有问题。

风扇吵,如果是最近才发生的而不是一直有的话就可能是摩擦的问题,可以打开机箱看看,看有无接线碍事,要不可以滴上一小滴机油。
06-04-27 @ 19:03

评论源自: casi
LINUX安全性如何? 是不是兼容不如瘟多司好?

最近老提不起看电影的兴致, 却想起两个老片, DISCLOSURE, 精彩的办公室斗争; COLLATERAL, 昏暗的人性. 我自己是不是就是生活里的办公室斗争中的昏暗人性? 或者只是喝多了没醒?
06-04-28 @ 06:31

评论源自: WANGHU
偶认为安全性是相对的。一个咚咚如果流行了,奏会变得不安全了。Windows也正因为它如此普及才会有这么多问题。Linux不能普及也是因为不如Windows好用。

微软的瘟虽然问题多多,却相对的来说是比较好的,奏像是民 主制度,非常糟糕,却找不到比它更好的。

Disclosure应该是女上司对男部下的性骚扰吧;另一部是阿汤第一次?演坏蛋,未免有些力不从心。

偶最近看的片子都不是大作:family stone, cavanosa, 恋爱地图。
06-04-28 @ 06:59

评论源自: casi
奏像是民 主制度,非常糟糕,却找不到比它更好的。
-------------------------------------------
都说出这么精练的话了, 怎摸又说 "Disclosure应该是女上司对男部下的性骚扰吧", 正常情况下, 有哪个部下敢骚扰上司? 所以骚扰骚扰, 实则是权力体现; 然后, 为伸摸说"阿汤第一次?演坏蛋,未免有些力不从心。", 客观说, 酱汤的技术应该算中等水准吧, 可能和FOX相比逊些, 但全片看下来我觉得没有明显漏洞, 在台词上很道地

06-04-28 @ 20:13

评论源自: WANGHU
这句精炼的话不是偶说的。

……不过要是抬杠的话……

如果上司没有魄力,反过来被部下骚扰也是有可能的;但那部片子,是一反通常男上司骚扰女部下的模式,才是偶说那句话的本意。

阿汤的演技一直是中等水准,可是因为他的名气,偶不得不对他严格要求一些。
06-04-29 @ 06:32

评论源自: casi
haa, 酱汤的定位应该是所谓偶像而非演技吧, 他的名气本不是从技术上来, 如果凭脸蛋就成为2M俱乐部一员, 还何必非钻研演技呢? 重要的是结果不是吗

跑提抬杠皆由我起, 惭愧惭愧
06-04-29 @ 07:35

评论源自: WANGHU
抬杠无所谓。TomCat(前一半)定位是偶像,但好莱坞的这些偶像都有一个梦想:成为演技派演员。阿汤对此付出了很大的努力,但,革命尚未成功。
06-04-29 @ 13:26

评论源自: Flora
请问IPP支持WinCE5.0操作系统吗?
06-06-07 @ 18:59

评论源自: WANGHU
Flora:请问IPP支持WinCE5.0操作系统吗?
-----------------------------------------
depends on what kind of CPU you are using.
06-06-07 @ 20:30