与 cortexa15 CPU(s) 相比,cortexa7 CPU(s) 执行循环花费的时间太长

cortexa7 CPU(s) took too long time to execute a loop compared to cortexa15 CPU(s)

我正在测试 CPU 性能。我用的是支持armv7和SMP的02板子:cortexa15@1.5GHz双核和cortexa7@1GHz双核。

然后,执行如下简单的循环并测量执行时间:

#define DEFAULT_CALC_LOOPS 1000
#define LOOPS_MULTIPLIER 4.2
...
loops = DEFAULT_CALC_LOOPS;
...
void *calc(int loops)
{
    int i, j;
    for (i = 0; i < loops * LOOPS_MULTIPLIER; i++) {
        for (j = 0; j < 125; j++) {
            // Sum of the numbers up to J
            volatile int temp = j * (j + 1) / 2;
            (void)temp;
        }
    }
    return NULL;
}

经过各种测试后02板上显示的结果:

以上结果相差很大

是否有任何依赖或限制影响结果?谁有这方面的经验可以分享我的想法?谢谢

对我来说,cortexa15 的性能是 cortexa7 的 2 - 3 倍以上。此外,我有 cortexa15@1.5GHz 和 cortexa7@1GHz。 所以我也觉得上面的结果是合理的。

下面我举一个cortexa15的case study来衡量执行时间:

  1. 计算CPU时间的公式:

    CPU执行时间=指令数x CPI x时钟周期

I:指令数

CPI:每条指令的周期数 (IPC = 1/CPI)

C:时钟周期(1/CPU时钟)-秒

  1. 推荐社区:https://en.wikipedia.org/wiki/Instructions_per_second

看看cortexa15双核(和iWave一样G1M/N)。

Cortexa15 在 1.5 GHz 时执行 9,900 MIPS,平均 IPC = 6.6

CPI = 1/IPC = 1/6.6 = 0.1515 cycle/instruction

  1. G1M/N 最大 1.5 GHz(时钟范围 ~1.3 GHz - 1.5 GHz) 我假设电路板会尽力而为 (1.5 GHz)

C = 1/(1.5.10^9) = 0.6667 ns

  1. 将 C 代码转换为 ARM arch 的汇编代码:

    for (i = 0; i < loops * LOOPS_MULTIPLIER; i++) {

        for (j = 0; j < 125; j++) {
            // Sum of the numbers up to J
            volatile int temp = j * (j + 1) / 2;
            (void)temp;
        }
    

    }

参考:https://godbolt.org

I = (((9+9) * 125) + 17) * 1000 * 4.2 = 9521400

CPU执行时间最终为0.000962秒。大约 0.962 毫秒 以 CPU.

的最大努力执行循环

在最坏的情况下(在 1.3 GHz),CPU 循环时间约为 1.109 毫秒

通过测试,我得到了相同的值。

--

我为 cortexa7@1GHz 做了更多案例。

CPU execution time = 9521400 * 1/1.9 * 1ns = 5.011 (ms)