在8个核心上执行相同的演算法,并且8个核心所输入的Input data也都是相同的,計算出來的結果也是正確的,但目前遇到一个问题。
当演算法执行完,core 0 ~ core 4 的运算时间都相当接近,约3.7秒。
core 5 ~ core7 的运算时间也都相当接近,约 10.8秒。
问题来了,相同的演算法,相同的Input data,为什么执行时间会差距这么大呢?core 5 ~ core 7是哪里出问题了?
或是在設定上什麼問題?
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.
在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不停的写入写出,你可以把动态分配的地址打印出来做一些分析。