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.

C6678 如何共享代码段

您好:

C6678 上电后,如何实现8个核共享同一个cmd文件?也就是说.text段放在共享存储器中,8个核运行时都去共享存储器取指令,但是如果这样操作的时候,8个核取指令的同时会产生一个地址冲突!

谢谢!

  • 多核编程的UserGuide:www.ti.com/.../sprab27a.pdf

    简单地,也可以:

    main()

    {

    coreID = GetCoreID();//DSP的DNUM寄存器

    switch(coreID)

    {

    case core0:

    task_core0(...);

    break;

    case core1:

    task_core1(...);

    break;

    ...

    default:

    break;

    }

    }

    一个image同时运行在不同核上。

  • Anna,您好:

    我想将8个核共享的段,单独拿出来,放到共享存储器中,这样的话,每个核的片内L2可以节省.text段大小的空间,比如:

    8个核的cmd文件中都有如下形式部分.这样8个核只需用这一段代码段,就不需要每个核都拥有这样一个相同的代码段.8个核取指令的时候都去MSMC取指令,不知程序能否这样设计?

    MEMORY

    {

    MSMC: o = 0c000000h l = 003fffffh

    }

    SECTIONS

    {

    .text > MSMC

    }

  • 当然可以。8个核可以使用同一个cmd文件,也可以使用不同的cmd文件。如果使用RTSC,可以通过修改Platform及*.cfg文件完成内存空间映射。

    针对共享内存控制的详细使用,请参考MSMC的UserGuide

    www.ti.com/.../sprugw7a.pdf

  • 您好:

    如果8个核同一时刻去共享存储器的同一地址取相同的指令,应该会产生地址冲突,如何解决这个冲突?

  • 方法一:使用硬件信号量。

    硬件信号量的User Guide:www.ti.com/.../sprugs3.pdf

  • 大部分时间,CORE是从各自的L1P CACHE中取指令,所以共享冲突的机会并不会太多,内部总线会有仲裁的

  • si cheng你好:

    只读取内存数据是不会冲突的,系统总线会自动仲裁,只是会有的master先读取和有的后读取的区别。只有写数据时才会出现冲突。你的代码段是只读的,因此不会存在冲突。

    如果是需要多个master读写某共享内存,那么建议使用硬件信号量,这样可以进行资源互斥,但是也要注意Cache一致性的影响。

    谢谢!

  • 还有对于每个核的预取机制可以大大减少共享内存访问冲突。

  • Anna,您好!

    您上面的过程应该是8个核同时运行某个代码段,但是它们是各自分开运行的,没有进行数据通讯。我想利用8个核共同来完成某段程序,而且它们的数据是共享的,应该怎么办?

  • 您好,

    先确认一下你的问题:8各核运行相同的代码,并且同时处理相同的数据?是这样么?

  • Andy Yin,您好!

    差不多是那样的,利用8个核同时处理算法的一段数据的不同部分,8个核只有一个main函数。能否给出详细思路,最好能给个具体的例程,谢谢!

  • 您好,

    可以根据coreID获取每个核处理的数据地址,然后并行处理即可。

  • #include<c6x.h>

    #include<stdio.h>

    int main()

    {

           int i=0;

           int Num=16;

           int a[16]={0};

           for(i=0;i<Num;i++)

                   a[i]=i;    //对数组赋初值

       switch(DNUM)

           {

            case 0:

                     for(i=0;i<2;i++)

                     {

                              a[i]=a[i]*2;

                              printf("a[%d]=%d \n",i,a[i]);

                     }

                     break;

            case 1:

                    for(i=2;i<4;i++)

                    {

                            a[i]=a[i]*2;

                            printf("a[%d]=%d \n",i,a[i]);

                     }

                     break;

            case 2:

                     for(i=4;i<6;i++)

                    {

                           a[i]=a[i]*2;

                           printf("a[%d]=%d \n",i,a[i]);

                     }

                   break;

            case 3:

                     for(i=6;i<8;i++)

                     {

                               a[i]=a[i]*2;

                               printf("a[%d]=%d \n",i,a[i]);

                      }

                    break;

            case 4:

                      for(i=8;i<10;i++)

                      {

                               a[i]=a[i]*2;

                                printf("a[%d]=%d \n",i,a[i]);

                       }

                     break;

              case 5:

                        for(i=10;i<12;i++)

                        {

                                   a[i]=a[i]*2;

                                    printf("a[%d]=%d \n",i,a[i]);

                         }

                        break;

               case 6:

                       for(i=12;i<14;i++)

                       {

                               a[i]=a[i]*2;

                               printf("a[%d]=%d \n",i,a[i]);

                       }

                      break;

             case 7:

                        for(i=14;i<16;i++)

                        {

                               a[i]=a[i]*2;

                               printf("a[%d]=%d \n",i,a[i]);

                         }

                        break;

                default:

                         break;

              }

             for(i=0;i<Num;i++)

             {

                      printf("a[%d]=%d \n",i,a[i]);

              }

             return 0;

    }

    以上程序在C6678上8个核运行,会发现8个核都运行了上面的程序,其结果如下:

    [C66xx_6] a[12]=24;

    [C66xx_6] a[13]=26;

    [C66xx_6] a[0]=0;

    [C66xx_6] a[1]=1;

    [C66xx_6] a[2]=2;

    . . .

    [C66xx_6] a[15]=15;

    ...

    结果是每个核都运行了程序,相当于对数组a有了8份数据的拷贝分别在8个核上处理,只是在switch中作了分支处理而已。

    我想实现8个核对一个数组a进行协同处理,使数组a每个元素都乘以2,应该怎么修改程序?

  • 你好 

    问个问题,

    如果是这样编程

    多核编程的UserGuide:www.ti.com/.../sprab27a.pdf

    简单地,也可以:

    main()

    {

    coreID = GetCoreID();//DSP的DNUM寄存器

    switch(coreID)

    {

    case core0:

    task_core0(...);

    break;

    case core1:

    task_core1(...);

    break;

    ...

    default:

    break;

    }

    }

    一个image同时运行在不同核上。生成一个image文件,在多个core上跑,是不是这个image要下载到多个核(debug的时候下载)?

    如果我image写到eeprom里呢,然后从i2c启动,他会把这个image读到八个core里面吗?

    如果不可以怎么让八个核都运行这段程序呢?

    谢谢!