This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DSP6657 cache问题

请教下ccs6.1 下面DSP6657 双核 cache问题,怎么查找问题

1. 如下代码N为73008,datatemp为int型数据

    _nassert((int)datatemp%8==0);

     #pragma MUST_ITERATE(8,,8)

    for(i=0;i<N;i++)

    {

            datatemp[i] = 0;

}

在打开L2cache时,速度要比关闭L2cache慢大概6倍

打开L2cache代码,运行时间长一些

   CACHE_setL1PSize(CACHE_L1_32KCACHE);

   CACHE_setL1DSize(CACHE_L1_32KCACHE);

   CACHE_setL2Size(CACHE_256KCACHE);//

关闭L2cache代码,运行时间短一些

   CACHE_setL1PSize(CACHE_L1_32KCACHE);

   CACHE_setL1DSize(CACHE_L1_32KCACHE);

   CACHE_setL2Size(CACHE_0KCACHE);//

去掉下面代码现象类似

    _nassert((int)datatemp%8==0);

     #pragma MUST_ITERATE(8,,8)

2. 下面这段代码正好相反,开L2cache则速度快很多

for(i=0; i<CCD_RECEIVE_IMGAGE_HEIGHT; i++)
{

for(j=0; j<CCD_RECEIVE_IMGAGE_WIDTH; j++)
{
*dsty= ((*ssrc_colour) & 0x00ff);
if(j&0x01)
{
*dstv= ((*ssrc_colour) & 0xff00)>>8;
dstv++;
}
else
{
*dstu= ((*ssrc_colour) & 0xff00)>>8;
dstu++;
}

dsty++;
ssrc_colour++;
}
}

  • 请问这两段代码的数组都是放同一块memory吗?
  • 是不是有可能第一段代码中短期内datatemp使用的不够频繁并且经常需要更新数据,所以没有体现出cache的优势。
    具体可以看看user guide 1.6 Principle of Locality
    If the data is fetched from a slow memory into a fast cache memory and is accessed as often as possible before it is being replaced with another set
    of data, the benefits become apparent.
    www.ti.com/.../sprugy8.pdf
  • 都是放在DDR中,上面的放在DDR的bank3中,下面的放在DDR的bank0,换过Bank现象是一样的。
  • 请问第二段代码的数组多大?第一段代码中N为73008是个大数组,访问大数组cache miss的开销也会很大,请参考附件的文档。

    L2 cache 会在写操作时被分配,对任何写操作,cache 控制器总是先把被访问的数据所在的 cache 行(128 bytes)读进 L2 cache,然后在 cache 中改写数据。被改写是数据会在发生 cache 冲突或手工 cache 回写操作时被最终写到外部存储里。当写操作的地址偏移是 1024 bytes 的整数 倍时,多个访问在 L2 cache 中发生冲突的概率很大,所以 L2 cacheable 写操作的时延会显著地 增加。最坏的情况下,每个写操作都会导致一个 cache 行的回写 (之前的数据因为冲突而被替换/ 回写)和一个 cache 行的读入(新的数据被分配到 cache 中)。 当地址偏移大于 512 bytes 时,DDR 页(行)切换开销成为性能下降的主要因素。C6678 EVM 上的 DDR 页(行)大小或 bank 宽度是 8KB,而 DDR3 存储器包含 8 个 banks。最坏的情况是, 当访问地址偏移量是 64KB 时,每个读或写操作都会访问相同 bank 中一个新的行,而这种行切换 会增加大约 40 个时钟周期的时延。请注意,不同的 DDR 存储器的时延可能会不一样。

    另外,数组的首地址应该按照cache line size对齐,数组大小也应该是L2 cache line size 128的整数倍。

    7875.TMS320C6678 存储器访问性能.PDF

  • 看代码访问应该是较频繁的,datatemp变量进行赋0的地址都是连续的。
  • 好的,谢谢,我看看,第二段代码CCD_RECEIVE_IMGAGE_WIDTH 参数为640,CCD_RECEIVE_IMGAGE_HEIGHT参数为480,是一个640*480的数组,只是用的是一个2层循环。
  • 好的,谢谢,我看看:
    1. 第二段代码的数组大小为640*480,是一个2层循环,CCD_RECEIVE_IMGAGE_HEIGHT为480,CCD_RECEIVE_IMGAGE_WIDTH为640;
    2. 写操作的地址偏移是说的数组2个数之间的偏移,还是与基地址的偏移?
    3. 上述2种情况L1的数据cache都是开着的,数组大小和首地址是128对齐的;
  • 是指每次写操作的地址偏移量。

    第一种情况的数组大小73008不是128的整数倍,请看一下地址是否128对齐。

  • 感谢回复,地址的定义是128bit对齐的,改成128byte对齐,速度没变化,那如果对DDR中的大数组的初始化,什么样的代码耗时最少,现在主频设置的1GHZ,DDR时钟为500M,32bit数据位,对上面的数组初始化73008个int型的数组(292032)进行初始化,开L2cache时耗时331791个clk,数据为1M以上,则初始化耗时都是ms级别。
  • 下面是您的代码在EVM板的测试数据,开L2cache比不开要快。

    开L2 cache 

    • Total cycles: 169466 
    • L1P, L1D, L2, DDR cache: 0x4, 0x4, 0x3000004, 0xd



    不开L2 cache 

    • Total cycles: 224516 
    • L1P, L1D, L2, DDR cache: 0x4, 0x4, 0x3000000, 0xc

    代码见附件。1731.DDR_Cache.zip