访问多行共享内存数据时(如下示例程序)速度很慢,严重影响算法的实时性,是否有更高效的实现方式
unsigned short *IN1,*IN2,*IN3,*IN4,*IN5,*IN6,*IN7,*IN8,*IN9,*IN10,*IN11;
IN1=imgin_ptr;
IN2=IN1+640;
IN3=IN2+640;
IN4=IN3+640;
…
IN11=IN10+640;
OUT=imgout_ptr;
for (i=0;i<256;i++)
{
for(j=0;j<640;j++)
{
sum=(IN1[0]+IN2[0]+…IN11[0])/11;
* OUT++sum;
IN1++;
IN2++;
…
IN11++;
}
}
yue li2:
楼主笔误了吧,主循环总应该为*OUT++ = sum吧;
关于这个问题,我也遇到过,看汇编结果,说的是每次隔行取数都会单独Load取指一次。感觉这段代码不换一个写法,效率是提不上来。
不知道楼主可试过单独用汇编写这一小段代码。。
同问TI工程师这个问题!!!!!!!!!!!!
Shine:
回复 yue li2:
请问你是几个核同时访问共享内存?是否有配成cache? 这段代码放在LL2也很慢吗?是否有尝试用优化选项?
yue li2:
回复 Shine:
之前我试过:
1.只用一个core(core0)访问,
2.cache都开了的,L1P、L1D都开的32K、L2cache为128k。
3.代码都是放在LL2的
4.编译器优化选项选的最高级-o3.
根据楼主贴出来的程序,11×1模板处理遇到的问题。我也去浮现了,看了编译器汇编信息,的确这种取指方式在楼主的这种使用条件下非常耗时间。但是用1×11模板处理耗时就会低一个数量级。
如何在不更改算法的前提下,解决这个耗时问题?
这样操作像素点是否恰当?比如楼主贴出来的代码
看资料得知,TI编译器已经把代码优化做得很好了,感觉ms级的程序,没有必要再在此基础上做线性汇编了。不知道我这样理解对不对。。
而且,我处理的图片比他的大很多 。。耗时问题就更突出了
总之问题就是,纵向取数和横向取数耗时相差太大!!!
qianfu li:
回复 Shine:
不,现在使用的是单核(core0),并且开了优化-O3,使用的内存也是ll2,做一次640×512图像竖向的11×1的极值大约需3ms
yue li2:
回复 Shine:
顶一下
yue li2:
回复 qianfu li:
再顶一下!d=====( ̄▽ ̄*)b
yue li2:
回复 yue li2:
没有答复了么。。。