davinci的edma3和c6000的emda2性能比较起来,edma3是很糟糕的设计。
edma2可以让用户自由选择一次拷贝数据量的宽度(8bit,16bit,32bit),这对视频数据来说,性能很高;
而edma3,只有sam和dam为固定地址的时候,才可以选择一次拷贝数据量的宽度(8bit,16bit,32bit,64,128,256bit),这对视频编码来说,sam和dam都不是固定的,所以fifo width只能是8bit,这简直就是灾难,性能太低下了。davinci还号称实现1080p,数据拷贝这块就基本上占满了带宽。
edma3是谁设计的?简直就是愚蠢。
Tony Tang:
呵呵,其实EDMA3更灵活了。
SAM,DAM在这里有点混淆,其实在通用外设只支持地址自增模式,在C6455上的维特比协处理器才支持常量地址模式,所以对于外设支持常量寻址时,是会有特殊说明的。
在地址不需要增加时,将index设为0即可。
对于EDMA传输,真正关心的是要传输的数据量,和同步模式。
对于数据宽度与EDMA2的配置只是方式变了,在A sync模式下,一个事件传输A count个byte的数据,对于AB sync模式,一个事件传输A*B个数据。
有问题欢迎进一步讨论。
Shaquille Wu:
回复 Tony Tang:
假设数据宽度是8bit和数据宽度是32bit,这两者情况下数据的传输速率能一样么?
对这块没太多研究,纯粹臆测。。。。。
尤其对什么是SAM、DAM,什么是“A sync”、“AB sync”,从来没注意过这几个概念。。。。。
Tony Tang:
回复 Shaquille Wu:
确实概念比较多,配置也很灵活,需要通读user guide才能领会;
如果是AB sync,即一个event触发传输A*B个数据,在这种情况下,只要A*B的大小一样,数据宽度即A是一个byte,还是一个word,对速度没有影响。
如果一次只想传输一个数据(8bit, 16bit, 或者32bit),那么要配置成A sync模式,且将A配置成相应的数据宽度。
wula:
回复 Tony Tang:
如果是AB sync,即一个event触发传输A*B个数据,在这种情况下,只要A*B的大小一样,数据宽度即A是一个byte,还是一个word,对速度没有影响。
这里指的“只要A*B的大小一样”是什么意思?是指A必须等于B?
我在emulator上做了一个测试,采用AB SYNC模式,A=128,B=128,拷贝方向为:ddr2->L2,ddr2=396*2Mhz,L2=495Mhz(cpu=990Mhz),所花cycle为9908.
我们按最低的频率来算(495Mhz),128*128=16384byte,如果按word换算,是4096word(128*128/4),而cpu统计的cycle值,是基于990Mhz的频率,所以,最终换算为4096*(990Mhz/495mhz)=8192,这个值和9908很接近;
至于“数据宽度即A是一个byte,还是一个word,对速度没有影响”,这段话的理解,我还真没在user guide看到,希望能具体指出它的出处。
Tony Tang:
回复 wula:
看一下EDMA user guide的Command Fragmentation章节,TC会把命令做优化后还传输的。所以在AB同步模式下,只要A乘以B的数量相等,A与B的数的组合是没有关系的,比如说A*B=32,是4*8还是8*4是一样的效果。
A*B是指A乘以B。
wula:
回复 Tony Tang:
感觉“Table 14. Read/Write Command Optimization Rules”表有些问题,至少从ACNT ≤ DBS这个来看,就很矛盾;
如果ACNT=128,不满足128<=32,就不能优化?应该更有利于优化才对吧?
就我在emulator上测试,ACNT=128,BCNT=128和ACNT=32,BCNT=128*4,最后处理完的cycle都是9908;