关于IPP中ippmMul_mv_64f效率问题

youxia000 2008-05-04 10:22:52
我要做一个3*3矩阵乘以3*1向量的计算,因为这个计算在我整个算法中要计算大约400万次,所以我写了个程序测试下
for(int i=0;i<100000000;i++)
{
oldX = XYZ[0] * Rwz[0][0] + XYZ[1] * Rwz[0][1] + XYZ[2] * Rwz[0][2];
oldY = XYZ[0] * Rwz[1][0] + XYZ[1] * Rwz[1][1] + XYZ[2] * Rwz[1][2];
oldZ = XYZ[0] * Rwz[2][0] + XYZ[1] * Rwz[2][1] + XYZ[2] * Rwz[2][2];

XYZ[0] = oldX;
XYZ[1] = oldY;
XYZ[2] = oldZ;
}

普通的乘法和 IPP中的一个函数
for(int i=0;i<100000000;i++)
{
IppStatus status = ippmMul_mv_64f((const Ipp64f*)Rwz, src1Stride1,
src1Stride2, src1Width, src1Height, (const Ipp64f*)XYZ,
src2Stride2, src2Len,
pDst, dstStride2);
XYZ[0] = pDst[0];
XYZ[1] = pDst[1];
XYZ[2] = pDst[2];
}
结果普通方法用时2.4s左右,而IPP的方法要用到4s+,请问这个是怎么回事,我的机器是pentium(R) D 3.0 3.0 1g 内存
按理说普通乘是单线程的,即使在单核上这两个用时也应该相当啊,在双核上不应该Ipp更慢
我用的是动态连接 IPP
...全文
416 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
youxia000 2008-05-30
  • 打赏
  • 举报
回复
好,希望你们快点出80核的时候能提供点光线追踪方面的东西,三维成像

那样我就不用去学习cuda了 嘿嘿

非常感谢了
Intel_merryhy 2008-05-29
  • 打赏
  • 举报
回复
上亿次的访问不连续内存对任何cpu的性能都是有影响的。 多核应该没有什么帮助。不过如果能用到ipp或者mkl函数,去做这些访问+计算的操作,可以减轻一些不当的内存访问带来的的性能影响。

光线追踪方面不多,你看看 ippmman.pdf=> Realistic Rendering 里的函数是不是对你有用?
youxia000 2008-05-14
  • 打赏
  • 举报
回复
哦,谢谢,不是很长看来用ipp就好了,目前没有MKL,是看了你回答问题的范围才知道的

在问个问题

多核对于 上亿次的访问不连续内存 这种问题有帮助么,当然是访问之后还要如上的进行矩阵 向量的乘法,在访问在做乘法这个样的循环

ipp以后会添加对光线追踪 方面的支持么
拔剑四顾007 2008-05-12
  • 打赏
  • 举报
回复
数学不是很好,看的有点吃力。
Intel_merryhy 2008-05-08
  • 打赏
  • 举报
回复
帖子沉的太快了,终于给我找到乐。
MKL和IPP的M库有相同的,那些不同的
>>MKL主要提供科学计算的函数。 一个简单的原则是:对相同函数,主要看你的计算向量尺寸,大的如上好几千就用MKL.

〉〉如果要做傅立叶变换,那个更好?
MKL 和IPP 原始傅立叶变换的核心是一样的,性能基本上也是一样的。你的数据类型和大小大概是多少呢? 如果是一维的两千左右的用IPP应该也可以。
Intel_merryhy 2008-05-06
  • 打赏
  • 举报
回复
对的,不是所有的IPP函数都是多线程的。(MKL 也是这样的。基本上矩阵乘向量的函数我们叫 BLAS level 2. 这种计算复杂度的O(n2)的我们没有进行特别的多线程,估计将来的版本可能会加上)。 这个函数是单线程的,所以cpu 只占用了一个核心。
这里是Intel® IPP threaded functions list:

http://support.intel.com/support/performancetools/libraries/ipp/sb/CS-026584.htm

你的ipp版本是多少?

youxia000 2008-05-06
  • 打赏
  • 举报
回复
在问一下MKL也是数学库,它和IPP的M库有相同的,那些不同的

MKL的库多少钱呢,如果要做傅立叶变换,那个更好?
youxia000 2008-05-06
  • 打赏
  • 举报
回复
我的是5.1的
youxia000 2008-05-05
  • 打赏
  • 举报
回复
OK,thanks very much.
I will show the new test,later
Intel_merryhy 2008-05-05
  • 打赏
  • 举报
回复
勤奋的同学呀! 我没具体测试,不过从经验上来说你的结论是对的。因为你的内部计算量非常小(only 9 mul+6 add),和IPP 函数调用的开销相比,可能开销更占用更多的时间。 所以,虽然IPP已经尽可能的对计算量的小问题进行优化,不过还是需用稍微大些的矩阵。 你可以试试比如:大于6x6以上的看看是不是好点?
youxia000 2008-05-05
  • 打赏
  • 举报
回复
100000000次的
for(int i=0;i<100000000;i++)
{
IppStatus status = ippmMul_mv_64f((const Ipp64f*)Rwz, src1Stride1,
src1Stride2, src1Width, src1Height, (const Ipp64f*)XYZ,
src2Stride2, src2Len,
pDst, dstStride2);
XYZ[0] = pDst[0];
XYZ[1] = pDst[1];
XYZ[2] = pDst[2];
XYZ[3] = pDst[3];
XYZ[4] = pDst[4];
XYZ[5] = pDst[5];
}
用时为8.183945s 算的过程看cpu 还是只占用了一个核心,
而用普通的写法大概4.270907s
如果减少到十分之一次for(int i=0;i<10000000;i++)
用时time1-0.427024,timeipp-0.814930
看来Ipp6*6的也没能节省多少时间,而且在调用过程浪费一些,

我奇怪的是为什么这个没有做双核方面的优化?

567

社区成员

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

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