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.

汇编与C混合编程的疑问

本人之前开发C6455,代码是C与汇编混合编程,关键代码采用汇编,运行速度相比C代码大约快10倍,但现有一点疑问,望请高手指教!

1. 存取数据的汇编指令LD,ST等对地址操作时,需要等待5个CPU周期,数据才能完成存取,但是手册中并未对地址空间进行说明,我的问题是如果操作的是L1地址空间,或者L2地址空间,或者外部内存,都需要等待5个CPU周期吗?我感觉应该是L1最快,L2其次,外部内存最慢,请高手指教!

  • 5 cycle指的是到L1的,其他的L2/DDR的时间不确定。

  • 感谢您的答复,按照您的答复,编写汇编函数时最佳原则应该使得存储、读取地址空间都处于L1,对吧?但L1空间确实有限,做图像算法时实在难以全部放入L1空间,有什么更好的提高效率的变成方案吗??谢谢!

  • 可以打开L1/L2 cache,在cache命中的情况下,速度也是很快的

  • Ce Song 说:
    存取数据的汇编指令LD,ST等对地址操作时,需要等待5个CPU周期,数据才能完成存取,但是手册中并未对地址空间进行说明,

    这5个cycle是delay slot(delay 4 cycle, 第5 cycle数据到寄存器),跟指令相关,跟内存位置无关,因为指令执行时分为了下表中的同步:

    Ce Song 说:
    我的问题是如果操作的是L1地址空间,或者L2地址空间,或者外部内存,都需要等待5个CPU周期吗?我感觉应该是L1最快,L2其次,外部内存最慢,

    内存的延时属于memory stall的延时,会反应在上表中E3阶段,所以实际上访问不同内存的时间是不一样的,区别在E3阶段加上的memory stall会不一样。

    详情参考文档sprufe8b: TMS320C674x DSP  CPU and Instruction Set Reference Guide

  • 感谢您的回答,使我对指令操作有了深入的理解。

    如果访问内存(通常我将要处理的数据放入L2)的时间不是固定的,那么我在汇编代码中排的流水操作是否会错乱?比如向寄存器A1 Load L2内存空间的数据,之后5个CPU Cycle对其进行操作,其实5个Cycle后数据可能并不一定到达寄存器A1,那么就会有问题了。

    但我在调试过程中从来没碰到这种错误,请高手指教!

  • 不会,这个延时叫做memory stall,不是function unit delay,它会导致流水线统一往后延时,所以寄存器的值的生命周期不会受影响。

  • Tony Tang

         非常感谢您的回答!!

  • 您好,我最近在写汇编语言,也正关注cache stall 的问题,我用的6678,在计算延迟周期时与手册上的延时周期对应不上。如“TMS320C66x CorePac User Guide”手册中59页提到过计算将32KB的L2SRAM中的内容touch到L1D中需要(0.5 × M + 16) + (10.5 + 4 × (M/2 -1) + 3 × M/2)=2070.5cycle(M Consecutive Parallel Read Misses(pipelined))。而我自己用汇编写的函数,每周期通过AB两侧的功能单元并行访问两个不同的CACHE line,将32KB的内容全部touch到L1D中只消耗了1443个周期。而采用单侧功能单元每周期touch一个CACHE line则需要2851个周期。

    不知道是什么原因?手册是否准确?我将L1D配置为32K,L2全部为SRAM。

    等待您的回信

  • 您好,我最近在写汇编语言,也正关注cache stall 的问题,我用的6678,在计算延迟周期时与手册上的延时周期对应不上。如“TMS320C66x CorePac User Guide”手册中59页提到过计算将32KB的L2SRAM中的内容touch到L1D中需要(0.5 × M + 16) + (10.5 + 4 × (M/2 -1) + 3 × M/2)=2070.5cycle(M Consecutive Parallel Read Misses(pipelined))。而我自己用汇编写的函数,每周期通过AB两侧的功能单元并行访问两个不同的CACHE line,将32KB的内容全部touch到L1D中只消耗了1443个周期。而采用单侧功能单元每周期touch一个CACHE line则需要2851个周期。

    不知道是什么原因?手册是否准确?我将L1D配置为32K,L2全部为SRAM。

    等待您的回信

  •  请重新到C6000多核论坛提问

    https://e2e.ti.com/support/development_tools/code_composer_studio/f/81/t/145583