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多核心执行時間的问题



在8个核心上执行相同的演算法,并且8个核心所输入的Input data也都是相同的,計算出來的結果也是正確的,但目前遇到一个问题。

当演算法执行完,core 0 ~ core 4 的运算时间都相当接近,约3.7秒。

core 5 ~ core7 的运算时间也都相当接近,约 10.8秒。

问题来了,相同的演算法,相同的Input data,为什么执行时间会差距这么大呢?core 5 ~ core 7是哪里出问题了?

或是在設定上什麼問題?

  • 理论上不应该有区别;不存在有任何设定会导致这种问题。

    因为没有代码流程,很难确定具体问题,如果算法完全一样,可能和内存的读写有关。

  • 经过测试后,发现是动态记忆体造成的。

    为了简化问题,故测试的程式如下。

    for (i = 0; i < (375x12288); ++i)

            {para[i] += 1;}

    当para动态配置3MB时(Case1),执行时间是正常的。

    当para动态配置48MB时(Case2),Core5 ~ Core7执行时间就有问题了。

                                         *para = (U16*)Memory_alloc(0, size1, 16, NULL);  //3MB (Case1)

                                         *para = (U16*)Memory_alloc(0, size2, 16, NULL);  //48MB (Case2)

    Core-0

    Core-1

    Core-2

    Core-3

    Core-4

    Core-5

    Core-6

    Core-7

    Case1 (ms)

    25.21

    25.16

    25.21

    25.15

    25.22

    25.24

    25.23

    25.24

    Case2 (ms)

    27.18

    27.13

    27.11

    27.11

    27.2

    736.61

    969.39

    972.07

    当Case2的动态配置改为静态时(Case3),执行时间就正常了

                                          *para = (U16*)0x95400000;

    Core-0

    Core-1

    Core-2

    Core-3

    Core-4

    Core-5

    Core-6

    Core-7

    Case3 (ms)

    25.22

    25.13

    25.21

    25.23

    25.13

    25.21

    25.24

    25.23

    最后,把演算法中48MB的动态记忆体配置也改为静态,执行时间就正常了。

    Core-0

    Core-1

    Core-2

    Core-3

    Core-4

    Core-5

    Core-6

    Core-7

    Median filter (s)

    3.27

    3.29

    3.29

    3.29

    3.29

    3.29

    3.28

    3.28

    所以现在有一个疑问,为何动态记忆体配置会造成这种问题,如Case2的数据?

  • 有两种可能

    一种是DDR3的访问是分bank和page操作的,可能在动态分配的时候分配的位置落在了同一个bank内,导致DDR3要不停的切换page导致开销增大;

    另一种是动态分配的内存正好对应cache的同一位置,导致cache不停的写入写出,你可以把动态分配的地址打印出来做一些分析。

  • 我想这应该是真正的原因了

    动态记忆体配置的区块,cores 5/6/7刚好被分在number 192

    而number 192的cacheable預設是被設為false,也就是这个区块的记忆体是不能进行cache的动作

    当我改为true之后,一切都正常了

  • 我想这是真正地原因了

    动态记忆体配置的区块,在分给cores 5/6/7时,是在number 192(如下图)

    而number 192的cacheable的预设值是false,也就是不能进行cache的动作

    当我把number 192的cacheable设为true之后,执行就正常了

  • Che-Cheng Hu,你好!

    请问你上面的有关MARs的窗口是从哪里打开的?