TI中文支持网
TI专业的中文技术问题搜集分享网站

多核编程问题

大家好,

我之前采用Message_Q机制进行多核编程,是参考TI的image-processing的例程进行编程的。我测试了一下该方法下通讯时间,主核向8个从核发送并收回一次消息需要121690个时钟周期,这对我的应用来说时间过长了,所以考虑采用其他的通讯机制。目前正在尝试各核直接读取公共内存区域MSMCSRAM的方法,并在MSMCSRAM中设置flag来保证各核之间的同步。首先请问一下做过这种方法的,这种方法进行8核通讯是否可行,通讯时间是否可以显著改善?

现在我只做两个核间的通讯,工作方式如下:

在MSMCSRAM上面设置三个数组,数组u用来存放整个的数据,u0和u1为两个维数较小的数组,分别用来存放u的前一半数据和后一半数据,其中u0用来存放0核写回的数据,u1用来存放1核写回的数据。开始时,对u、u0、u1分别设置初始值,0核和1核读入数组u,核0对u的前一半数据进行操作并把更新后的数据写回u0并使能标志flag0,核1对u的后一半数据进行操作并把更新后的数据写回u1并使能标志flag1。在核0上轮循检查flag0和flag1是否都已使能,若是,则把u0和u1的数据分别copy到u的前一半和后一半,并一次性写回u。

我现在测试程序发现虽然我已在核1上面把u1更改并写回,但是在核0输出时u1仍然是之前设置的初始值。我觉得我的程序逻辑上没有问题,但不知道为什么会有这样的问题。附件里是我的程序和link file,程序比较简单,恳请大家帮忙看一下。

谢谢!

Andy Yin1:

您好,

你所使用的这种核间同步方式在系统复杂度很高时,容易出现死锁,并且容易导致核在死等而没有充分利用核资源。建议使用硬件信号量,QMSS等产生中断的方式。

你出现的问题很有可能是没有维护cache的一致性,注意core1在回写后需要cache flush,core0在读数之前进行cache invalid。

Yang Lu:

回复 Andy Yin1:

Andy 您好,

感谢您的回复!请问一下您所说的QMSS方式是否就是基于QMSS QPEND的IPC通讯方式,需要使用SYS/BIOS和IPC。另外请问是否有采用这种方式进行核间通讯的简单例子,最好是从核是8个核均使用到的,谢谢。

另外关于Cache的问题,我在每次读数之前都进行了CACHE_invL1d((void*)&var, CACHE_L1D_LINESIZE, CACHE_WAIT),在每次写数据后都用了CACHE_wbL1d((void*)&var, CACHE_L1D_LINESIZE, CACHE_WAIT)写回内存,其中var表示相应的数组,即u、u0或u1。所以我想应该维护了Cache的一致性,但不知为何仍然出现问题。

期待解答,谢谢!

Andy Yin1:

回复 Yang Lu:

1. 关于QMSS多核通信的例子参考mcsdk中的multicoreNavigator例子,实现4个核之间的,可以自己修改;

2. 可以在memory browser中通过勾上L1/L2 cache看一下数据是否有变化,如有变则说明是cache一致性维护的问题。

赞(0)
未经允许不得转载:TI中文支持网 » 多核编程问题
分享到: 更多 (0)