您好~最近需要用6678实现一个工程,将一块大数据直接均分成8块,由8个核分别处理一块数据,核间不进行通信,数据是由EDMA从DDR3中传输到L2中进行处理,处理完重新传到DDR3中储存。单核跑这段程序时,时间可以满足要求,但是让8个核同时运行时,所需的时间却是单核跑这段时间的好几倍,完全满足不了要求。EDMA设置为8个通道,每个QUEUE进行处理了。我将处理的数据缩小一些后,八个核同时跑的加速比却是能接近8倍的。不知道是由什么原因引起的?希望专家们能指点下~
Andy Yin1:
您好,
请问你的EDMA与core的处理是如何同步的,是采用查询还是中断的方式?有可能是由于你每个核需要等EDMA搬运完成才处理导致,建议可以先使用EDMA搬运数据到一个核上处理,看看一个核处理1/8的数据时的性能提升度。
hobo Q:
回复 Andy Yin1:
您好~谢谢~我是通过查询IPR的对应位置进行判断EDMA是否传输完的,每个核都等数据传输完后,再进行数据的处理。我是这样子测的:假如需要处理8192个数据,我先测好一个核处理1024个数据的时间,然后一起8个核均跑1024个数据,测出来的结果就如我上面所说的差别很大!但假如,我需要处理1024个数据,每个核跑128的数据的话,测出来的加速比接近8倍。谢谢~不知道什么原因,困扰有段时间了,一直在找原因。谢谢~
Thomas Yang1:
回复 hobo Q:
你所谓的1024个数据是指1024bytes吗?数据处理是否放在DDR3中的,L2cache有没有开?
L2 CACHE LINE SIZE 刚好是128 bytes,如果你开了L2 cache,那么每个core处理的128bytes 数据全都会map进L2 cache,这样8个core的处理 互不影响。如果你的处理数据大于一个cache line,那么每次读取实际内容都需要从DDR3中读取,这样8个core 并行处理,如果访问的目标数据在一个bank中,由于bank confliction,对整体性能就会有较大的影响
hobo Q:
回复 Thomas Yang1:
您好~谢谢~我的数据是从DDR3通过EDMA传输到L2中进行处理,L2没开CACHE,我指的1024只是个例子,我实际上要处理的数据每次基本是32768个float型,也就是128KBytes。数据的处理都是在自己核的L2中进行的,应该不会有冲突的吧?谢谢~
Thomas Yang1:
回复 hobo Q:
如果在各自的L2中不会有什么冲突。数据处理如果有共享的,需加上cache 一致性维护