在8个核心上执行相同的演算法,并且8个核心所输入的Input data也都是相同的,計算出來的結果也是正確的,但目前遇到一个问题。
当演算法执行完,core 0 ~ core 4 的运算时间都相当接近,约3.7秒。
core 5 ~ core7 的运算时间也都相当接近,约 10.8秒。
问题来了,相同的演算法,相同的Input data,为什么执行时间会差距这么大呢?core 5 ~ core 7是哪里出问题了?
或是在設定上什麼問題?
Allen35065:
理论上不应该有区别;不存在有任何设定会导致这种问题。
因为没有代码流程,很难确定具体问题,如果算法完全一样,可能和内存的读写有关。
Che-Cheng Hu:
回复 Allen35065:
经过测试后,发现是动态记忆体造成的。
为了简化问题,故测试的程式如下。
for (i = 0; i < (375×12288); ++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的数据?
Allen35065:
回复 Che-Cheng Hu:
有两种可能
一种是DDR3的访问是分bank和page操作的,可能在动态分配的时候分配的位置落在了同一个bank内,导致DDR3要不停的切换page导致开销增大;
另一种是动态分配的内存正好对应cache的同一位置,导致cache不停的写入写出,你可以把动态分配的地址打印出来做一些分析。
Che-Cheng Hu:
回复 Allen35065:
我想这应该是真正的原因了
动态记忆体配置的区块,cores 5/6/7刚好被分在number 192
而number 192的cacheable預設是被設為false,也就是这个区块的记忆体是不能进行cache的动作
当我改为true之后,一切都正常了
Che-Cheng Hu:
回复 Allen35065:
我想这是真正地原因了
动态记忆体配置的区块,在分给cores 5/6/7时,是在number 192(如下图)
而number 192的cacheable的预设值是false,也就是不能进行cache的动作
当我把number 192的cacheable设为true之后,执行就正常了
comeback:
回复 Che-Cheng Hu:
Che-Cheng Hu,你好!
请问你上面的有关MARs的窗口是从哪里打开的?