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.

6678多核协作问题



我想达到的目标是这样的:core0进行任务分派工作,给core1-6分派不同的任务,待core1-6都完成后,启动core7进行任务汇总。

其中,任务分派和汇总过程中需要进行核间数据的传递。

有下面几个问题:

1、程序是否共享?

-----》几个核是运行同样的源代码,源代码中通过DNUM来区分不同部分;

-----》每个核编写不同的工程。

-----》这两种方式特点如何,适用于怎样的方式呢,我不知道该如何选择

2、如果多核运行同一程序(放在MSMC上),通过DNUM来区分不同部分的话,那么程序中的变量(局部、全局)多核是否共享,能否直接访问,这种方式可行性如何,有何特点?

3、core之间通信方式如何?

-----》核间通信有很多种方法,该如何选择?

4、core0通过IPC这种方式发中断给core1-6,中断处理函数如下,上电第一次6个核能全部响应,但是均提示Invalid CIO command (48)...

再次执行后都只有部分核能有响应。(我说的响应指的是console里会有信息输出)

void ipc_handler(void* handler)

{

volatile uint32_t read_ipcgr;

uint32_t CoreNum;

CoreNum = CSL_chipReadReg(CSL_CHIP_DNUM);

printf("Core number : %d",CoreNum);

read_ipcgr = ((CSL_BootcfgRegs*)CSL_BOOT_CFG_REGS)->IPCGR[CoreNum];

if(1 == CoreNum)

{

printf("in ...\n");

}

else if(2 == CoreNum)

{

printf("in ...\n");

}

else if(3 == CoreNum)

{

printf("in ...\n");

}

else if(4 == CoreNum)

{

printf("in ...\n");

}

else if(5 == CoreNum)

{

printf("in ...\n");

}

else if(6 == CoreNum)

{

printf("in ...\n");

}

else if(7 == CoreNum)

{

printf("in ...\n");

}

((CSL_BootcfgRegs*)CSL_BOOT_CFG_REGS)->IPCAR[CoreNum] = read_ipcgr;

}

这种方式是否可行?core0发中断有什么时间要求,core1-6的处理函数有什么时间要求?为什么我的程序中无法正常响应?

谢谢了。

  • 你好,

    我回答下第1,2个问题

    1.程序是可以共享的,你可以采取下面的结构来实现

    swith(DNUM)

    {

    case 0:

    function_0();

    break;

    case 1:

    function_1();

    break;

    ... ...

    case 7:

    function_7();

    break;

    default:

    break;

    }

    这种方式是所有的和都加载同一段代码,然后通过DNUM来区分不同和执行的程序段。

    然后你问题中有提到编写不同的工程的方式来实现多核的程序,这也是可以的,但这种你要注意不同工程的代码段和数据段的分配,不要重叠就可以了。

    2.多核之间是可以共享全局变量的,不管变量放在共享的存储区里还是放在单个核的本地存储里。

  • Yue Cao,谢谢你的回复。

    关于你的回答有些地方想详细的了解下。

    1、请问多核之间全局变量是如何共享的?就两种情况而言,放在本地存储里和MSMC里。

    2、请问我采用所有核都加载同一段代码,然后通过DNUM来区分不同和执行的程序段这种方式,将所有段都放在MSMC中,按照你的意思局部变量应该是不能共享的,请问是如何做到的呢?因为这个局部变量在每个核中地址都是一样的。

    不是很理解,希望帮助解答下。

  • 问题4:已经解决,参见www.deyisupport.com/.../11450.aspx

    另外出现Invalid CIO command的问题可能是由于我将cmd文件中.cio段设置在MSMC中导致的,改为L2后,不再出现问题。

  • 你好,

    1.全局变量放在本地和共享区都是可以的,比如你把全局变量放到共享区(0xc000000~0xc3ffffff)所有核对它的访问地址都是(0xc000000~0xc3ffffff),如果你把全局变量放到本地L2比如0核(0x00800000~0x0087ffff)0核对该地址的访问还是原地址,但1核对该地址的访问就自动变为(0x10800000~0x1087ffff),综上所述全局变量放在哪里都是可以的

    2.该问题同上相似,每个核的L2都有两个寻址地址(本地核访问一个,其他核访问一个)

    上述的详细资料你可以参见SPRS691C中第五部分C66x CorePac

    有问题欢迎继续交流!

  • Yue Cao,谢谢你耐心细致的解答。我明白了。

  • Yue Cao你好,还有一个问题想追问一下。

    你说全局变量放在哪里都可以的,是不是隐含意思是局部变量只能放在每个核自己的本地存储里?

    如果我把局部变量放在MSMC中会有什么影响。