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.

EDMA搬移数据的的时间怎么省去?



         技术支持你们好~~我用的是Texas Instruments\pdk_C6678_1_0_0_16\packages\ti\csl\example\edma下面的edma_test.c改写的EDMA程序。

        基本思路是:对DDR3中的一个矩阵一行(或者一列)用EDMA搬移至L2中,进行算法处理,最后把处理后的数据搬移至DDR3中。

        这样的话数据的搬入和搬出是需要暂用CPU的时间的,特别是跳地址取或者存数据的时候时间会变得更加多。而实际上DMA应该是不暂用CPU时间的,应该只要配置寄存器后触发一下就可以了(201里面好像就是这样的),想问一下怎么去掉EDMA搬移数据的时间呢?上次Anddy说是可以通过排流水,能具体介绍下吗?还不是很了解这个内容,有没有例程可以参考下呢?

        还有一个问题是:单核处理的时间本来比较少,但是用单核的程序改写成多核程序,做了一些同步后发现时间会多的很多,比如单核处理时间是0.08s,但是多核处理做了同步后时间变成了0.14s。

        因为多核的程序就是由单核的程序改写的,只是每个核处理不同的数据块而已,那么每个核的处理时间基本上和单核应该差不多才对啊,仅仅是多了几个同步的时间,按道理说同步不会特别费时的啊~麻烦技术支持解答下,谢谢~~~~~~

  • 你可以根据数据搬移源地址和目标地址,块大小,以及块之间的跳转偏移,去配置ACNT,BCNT,CCNT以及SRC 和DST 的BINDX,CINDX,你不用每次都去重配PARA的。对于你的第2个问题,请问你的同步是怎么实现的呢?

  •      谢谢您的回答,我测试了一下,配置其实是不好时间的,只是传输数据时候需要等待数据传输完成才可以做处理,比如

          do {

                        CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,&regionIntr);

                 } while (!(regionIntr.intr & 0x1));

        完成了以后才可以继续算法,这个时候CPU其实是等待的。

     我用的是在MSMC里面设置一个共享的标志数组如flag[8],每个核做完了算法后将对应的位置置1,最后所有的和全部置1了之后表示同步做好了,也考虑了cache的一致性。但是多核的时候时间比单核多很多。

     现在我怀疑是不是EDMA在多核传输的时候传输速度会变慢?我用的是EDMA0,每个核对应其中一个通道来传输,都对应到queue0上面了,这样在多核的时候是不是速度降低了呢?麻烦给解释一下原理,谢谢~~

  • 从你的信息来看,你测试的benchmark由2部分组成,算法部分,和EDMA搬移时间

    1) EDMA搬移,在不同的memory region之间发送的时候,带宽会有所不同,具体你可以参考application report<throughput performance guide for C66x Keystone devices> .

    2)  你提到多核时间比单核多很多,是指程序运行拆分到多核中分别运行 还是 没拆分直接在多核中运行?。按照你的表述同步是用查询做的,并且做了cache一致性维护,这些都需要消耗cycle的。你可以在EDMA搬移完成后,考虑用中断的方式来通知同步核