大家好,
我最近尝试把CPU上跑的程序移植到DSP上。听说代码在DSP上需要进行一定程度的优化才能赶上CPU的性能,所以这段时间我对DSP的优化进行了学习。
我尝试在DSP上测试一些基本的程序,然后查看它的测试结果,但是这其中发现很多我无法解释的问题。首先,我解释介绍一下我的环境:
我用的是TI C6678的EVM开发板,我跑的是SYS/BIOS,我在Core0上建了一个Task,在这个task上我写了一个基本的三重循环的程序:
for (i = 0; i < NI; i++)
{
for (j = 0; j < NJ; j++)
{
C[i*NJ + j] *= BETA;
for (k = 0; k < NK; ++k)
{
C[i*NJ + j] += ALPHA * A[i*NK + k] * B[k*NJ + j];
}
}
}
其中NI,NL,NK都是4096.
在运行程序的时候,我发现了两件事情:
1. 当我使用restrict来限定A和B的时候,software pipeline会对程序做一定的优化,理想的运行时间会快三倍左右。但是系统能做出这么大的优化不是很可信。于是,我比较使用和不适用restrict关键词之后输出结果C[ ],然后我发现他们的计算结果存在一些一定的误差。restrict关键词是用在没有bad alias的时候,在程序中A,B,C之间没有数据重叠的情况,我不是很确定为什么restrict会对计算结果产生影响。
2. 我尝试打印一些运行时间,
// // Get Stop Time
// g_ui64StopTime = (uint64_t)(TSCL) ;
// g_ui64StopTime |= (uint64_t)((uint64_t)TSCH << 32 ) ;
// g_ui64ElapsedTime = g_ui64StopTime - g_ui64StartTime;
//
// // Get Start Time
// g_ui64StartTime = (uint64_t)(TSCL) ;
// g_ui64StartTime |= (uint64_t)((uint64_t)TSCH << 32 ) ;
然后发现编译之后software pipeline又出现了不同的优化结果。当我打印每一个k循环的时候,software pipeline显示的理想运行时间又提高了三倍,但是我在实际运行的时候,整体的运行时间却增长了很多。
另一件奇怪的事情是,当我打印每一个J循环的时候,software pipeline并没有什么不同的优化结果,运行的时间约为25分钟,但是如果我不打印任何时间的时候,整个运行的时间是140分钟 (我用手表掐表的)。
这两个问题至今让我摸不着头脑,如果大家有什么经验分享给我,我不胜感激。