文章目录
锁定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指令IPC | 3.5 | 1.01 | 3.82 |
72MB memcpy IPC | 0.4 | 0.56 | 0.74 |
all cached 1KB memcpy IPC | 1.53 | 0.54 | 1.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;
}