IPP改用静态链接后速度变慢的问题

GaoYang 2008-11-18 05:43:17
有这么一段代码,在静态链接的时候速度是动态链接的4倍,比较奇怪。以前一直是动态链接,刚刚改成动态链接,想改成运行时自动分配CPU类型的方式,不知道是不是我用的方法不对。有一些代码

先说明一下环境
IDE:VC2008SP1
Compiler:Intel 11.0.061
IPP:6.0.0.062
CPU:Q6600
RAM:4G
SYS:WINXP32

#include "ipp.h"

// 动态链接
#pragma comment(lib,"ippi.lib")
#pragma comment(lib,"ippcv.lib")

// 静态链接
//#pragma comment(lib,"ippcorel.lib")
//#pragma comment(lib,"ippsemerged.lib")
//#pragma comment(lib,"ippsmerged.lib")
//#pragma comment(lib,"ippiemerged.lib")
//#pragma comment(lib,"ippimerged.lib")
//#pragma comment(lib,"ippcvemerged.lib")
//#pragma comment(lib,"ippcvmerged.lib")
//ippStaticInit();

Ipp32s pKernel[ 100 ] = {
-1, -1, -1,
-1, 12, -1,
-1, -1, -1 };
IppiSize kernelSize = { 3, 3 };
IppiPoint anchor = { 1, 1 };
int divisor = 4;
IppiSize RoiSize = { m_imgSize.width - 2, m_imgSize.height - 2 };

st = ippiFilter_16u_C1R(
pSrc + m_imgSize.width + 1, m_imgSize.width * sizeof( Ipp16u ),
pDst + m_imgSize.width + 1, m_imgSize.width * sizeof( Ipp16u ),
RoiSize,
pKernel, kernelSize, anchor,divisor );
if( ippStsNoErr != st )
return st;

/c /Ox /Og /Ob2 /Oi /Ot /Oy /GT /Qipo /GA /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "ALGORF_EXPORTS" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /EHsc /MT /GS /Gy /fp:fast /Fo"Release/" /W4 /nologo /Zi /Qopenmp /Qftz /QxSSSE3 /Qparallel /Qwd174 /Qopenmp-lib:compat

kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /OUT:"D:\Project\EComAlgo\Release/AlgoRF.dll" /INCREMENTAL:NO /nologo /MANIFEST /MANIFESTFILE:"Release\AlgoRF.dll.intermediate.manifest" /MANIFESTUAC:NO /DEF:"AlgoRF.def" /TLBID:1 /DEBUG /PDB:"D:\Project\EComAlgo\Release\AlgoRF.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:\Project\EComAlgo\Release\AlgoRF.lib" /MACHINE:X86 /DLL

同样条件下,下面这段代码就没什么问题。
IppiSize RoiSize = { m_imgSize.width - 2, m_imgSize.height - 2 };
st = ippiFilterMedianCross_16u_C1R(
pSrc + m_imgSize.width + 1, m_imgSize.width * sizeof( Ipp16u ),
pDst + m_imgSize.width + 1, m_imgSize.width * sizeof( Ipp16u ),
RoiSize,
ippMskSize3x3 );
if( ippStsNoErr != st )
return st;
...全文
275 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
GaoYang 2008-11-21
  • 打赏
  • 举报
回复
呵呵,多谢~~~
intel_cyu 2008-11-20
  • 打赏
  • 举报
回复
另外, 调用IPP静态函数,需要调用CPU 初始化函数:
IppStatus ippStaticInit(void);

动态库,会自动检测CPU类型,选择CPU优化代码。 静态库是,需要调用CPU初始化函数。


GaoYang 2008-11-19
  • 打赏
  • 举报
回复
赫赫,问题解决了,应该用带_t的lib,貌似_t是夺线程版本。

#pragma comment(lib,"ippcore_t.lib")
#pragma comment(lib,"ippsemerged.lib")
#pragma comment(lib,"ippsmerged_t.lib")
#pragma comment(lib,"ippiemerged.lib")
#pragma comment(lib,"ippimerged_t.lib")
#pragma comment(lib,"ippcvemerged.lib")
#pragma comment(lib,"ippcvmerged_t.lib")

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧