Android 性能优化C/C++ --CPU篇

锁定Android系统CPU的频率

转载

如何锁定Android系统CPU的频率
接触到了Android系统的Performance测试,所以有锁定CPU的需求:
由于要首先读取到此系统所支持的CPU频率,之后再所支持的频率中选取你想要的频率,之后进行锁定。
这个过程,手动也是可以的,直接:

1.查看所支持的CPU频率:
adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
返回的结果是:416000 728000 900000 1040000

2.从上边的结果中选取一个416000 ,之后进行设定:
echo 416000  > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 416000  > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

3.之后运行adb shell环境,输入
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
查看设置是否有效,假如一直是416000,则证明设置生效。

memcpy 大小核心,cpu cycle利用率分析

小核最高频率数据:
inst_count:6291814 cycle_count:15716011 ipc:0.40
memcpy_test time_cost_ms: 8.77ms

加入usleep(10)
inst_count:6291861 cycle_count:16988623 ipc:0.37
加入usleep(10*1000)
inst_count:6291861 cycle_count:16408867 ipc:0.38
加入usleep(50*1000)
inst_count:6291860 cycle_count:12469164 ipc:0.50

标准指令测试:
ipc_monitor_end cpy inst_count:939524671 cycle_count:933419245 ipc:1.01

大核数据:
ipc_monitor_end cpy inst_count:6291806 cycle_count:11312895 ipc:0.56
memcpy_test time_cost_ms: 4.69ms
标准指令测试:
ipc_monitor_end cpy inst_count:939524364 cycle_count:268444934 ipc:3.50

超大核
ipc_monitor_end cpy inst_count:6291806 cycle_count:8526119 ipc:0.74
memcpy_test time_cost_ms: 5.80ms
ipc_monitor_end cpy inst_count:939524364 cycle_count:246077817 ipc:3.82

CPU IPC测试

大核心 2.41GHz小核心1.8GHz超大核 2.8 GHz
标准Loop指令IPC3.51.013.82
72MB memcpy IPC0.40.560.74
all cached 1KB memcpy IPC1.530.541.54
all cached 1KB memcpy IPC最大利用率43%60%40%
比较而言 ,上图中的小小核心的IPC利用率会更高一点。但是最终的IPC较低。

执行时间 = 指令/IPC * 频率

memcpy IPC 过低的原因

1.DDR带宽较低
不同的CPU对不同的DDR访问时间同。DDR响应时间在100个CPU周期左右。

memcopy的理想情况 - all cached

测试条件:1K copy, 循环10000次。可以认为 allcached

    size_t buf_size =  1 * 1024;
    uint8_t * buf_src = new uint8_t[buf_size];
    uint8_t * buf_dest = new uint8_t[buf_size];
    memset(buf_src, 0x33, buf_size);
    memset(buf_dest, 2, buf_size);

    // start test 
    long long fds = ipc_monitor_start();
    gettimeofday(&start_t, NULL);
    for (int i = 0; i < 10000; i++)
        memcpy(buf_dest, buf_src, buf_size);

IPC

  • 小核心 IPC = 0.54
    ipc_monitor_end cpy inst_count:2470317 cycle_count:4613328 ipc:0.54
    memcpy_test time_cost_ms: 2.56ms

  • 大核心 --IPC 不稳定, all cached IPC = 1.53/0.66
    ipc_monitor_end cpy inst_count:2490311 cycle_count:1622651 ipc:1.53
    memcpy_test time_cost_ms: 1.54ms
    ipc_monitor_end cpy inst_count:2470311 cycle_count:3721285 ipc:0.66
    memcpy_test time_cost_ms: 2.69ms

memcpy总结

72MB memcpy中小核心 IPC已经达到最大利用率60%, 大核心未达到最大的IPC利用率43%。
所以小核瓶颈在CPU,大核心瓶颈在内存带宽。

标准测试代码

long long inst_test( int loop = 1) {
    long long i = 0;
    long long fds = ipc_monitor_start();
    long long out_count = 0;
    for (int j = 0; j < loop; j++) {
        for (i = 0; i < 128 * 1024 *1024; i++) {
                out_count += i%2;
        }
    }
    ipc_monitor_end(fds);
    return out_count;
}

代码参考
https://github.com/vicentzeng/memcpyOpt

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值