<-- Home |--c |--cpp |--rust

Coding_on_android机上编译运行C/Cpp/Rust程序

手机的CPU整天没事干怎么办?

有些人,比如我,总是会觉得一个CPU没有在满功率运行是一种犯罪……

而现在的手机,实际上非常强力,通常有8个核的高性能CPU,还有GPU还有一堆内存。怎么办?

看看这个CpuInfo,简直是厉害啊。

 1processor : 0
 2BogoMIPS : 2000.00
 3Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti amu ecv wfxt
 4CPU implementer : 0x48
 5CPU architecture: 8
 6CPU variant : 0x2
 7CPU part : 0xd23
 8CPU revision : 1
 9
10processor : 1
11BogoMIPS : 2000.00
12Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti amu ecv wfxt
13CPU implementer : 0x48
14CPU architecture: 8
15CPU variant : 0x2
16CPU part : 0xd23
17CPU revision : 1
18
19processor : 2
20BogoMIPS : 2000.00
21Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti amu ecv wfxt
22CPU implementer : 0x48
23CPU architecture: 8
24CPU variant : 0x2
25CPU part : 0xd23
26CPU revision : 1
27
28processor : 3
29BogoMIPS : 2000.00
30Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti amu ecv wfxt
31CPU implementer : 0x48
32CPU architecture: 8
33CPU variant : 0x2
34CPU part : 0xd23
35CPU revision : 1
36
37processor : 4
38BogoMIPS : 2000.00
39Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti amu ecv wfxt
40CPU implementer : 0x48
41CPU architecture: 8
42CPU variant : 0x2
43CPU part : 0xd46
44CPU revision : 1
45
46processor : 5
47BogoMIPS : 2000.00
48Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti amu ecv wfxt
49CPU implementer : 0x48
50CPU architecture: 8
51CPU variant : 0x2
52CPU part : 0xd46
53CPU revision : 1
54
55processor : 6
56BogoMIPS : 2000.00
57Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti amu ecv wfxt
58CPU implementer : 0x48
59CPU architecture: 8
60CPU variant : 0x2
61CPU part : 0xd46
62CPU revision : 1
63
64processor : 7
65BogoMIPS : 2000.00
66Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti amu ecv wfxt
67CPU implementer : 0x48
68CPU architecture: 8
69CPU variant : 0x2
70CPU part : 0xd05
71CPU revision : 1

其实手机上完全能够搞点这样的活动,而且不需要什么root,什么华为的HarmonyOS,也完全没有问题。我的Iphone最近被刷烂了,没法再整IPhone了。

手机上编译C/Cpp程序

其实Termux已经挺成熟的,直接去下载就行Termux:Android

安装Termux跟普通的Android应用没有区别,就是一个独立的app,安装好了之后能够打开一个黑乎乎的命令行。

后面安装软件,跟普通的Linux没有区别,apt install clang或者dpkg install clang,然后就可以编译C/Cpp程序了。

那我们就简单的测试一下,前面我还在施工的Eigen3,这个项目的代码在:Eigen3Tutorial

为了可以运行这些测试,我们需要安装几个工具:

1apt install clang cmake git eigen

特别是是这个eigen,跟libeigen3-dev不一样。我们通过apt search eigen才发现它的。

整好了之后,就可以:

1git clone https://github.com/qchen-fdii-cardc/eigen3tutorial.git
2cd eigen3tutorial
3cmake -B build
4cmake --build build

然后发现,所有的几个例子都可以任意执行。

编译Rust程序

Rust同样没有问题,可以直接apt install rust,然后cargo这一套完全可以用。

最好的一点是,Termux的镜像整得特别好,会循环更新亚洲区、国内各个高校的镜像,所以下载速度特别快。

 1use rayon::prelude::*;
 2use std::time::Instant;
 3use rand::Rng;
 4
 5fn monte_carlo_pi(samples: u64, threads: usize) -> (f64, std::time::Duration) {
 6    let start = Instant::now();
 7    
 8    // 使用局部线程池而不是全局线程池
 9    let pool = rayon::ThreadPoolBuilder::new()
10        .num_threads(threads)
11        .build()
12        .unwrap();
13    
14    let hits: u64 = pool.install(|| {
15        (0..samples)
16            .into_par_iter()
17            .map(|_| {
18                let mut rng = rand::rng();
19                let x: f64 = rng.random_range(-1.0..1.0);
20                let y: f64 = rng.random_range(-1.0..1.0);
21                if x*x + y*y <= 1.0 { 1 } else { 0 }
22            })
23            .sum()
24    });
25    
26    let duration = start.elapsed();
27    let pi_estimate = 4.0 * hits as f64 / samples as f64;
28    
29    println!("🎯 Threads: {}, Time: {:?}, π ≈ {:.6}", 
30             threads, duration, pi_estimate);
31    (pi_estimate, duration)
32}
33
34fn main() {
35    let samples = 10_000_000;
36    println!("📱 手机CPU并行计算演示");
37    println!("🔢 计算π值 ({}M 采样点)", samples / 1_000_000);
38    
39    // 获取CPU核心数
40    let cpu_count = num_cpus::get();
41    println!("🔧 检测到 {} 个CPU核心", cpu_count);
42    
43    let mut results = Vec::new();
44    
45    for threads in 1..=cpu_count {
46        let (pi_val, duration) = monte_carlo_pi(samples, threads);
47        results.push((threads, pi_val, duration));
48    }
49    
50    // 显示加速比分析
51    println!("\n📊 性能分析:");
52    if let Some((_, single_pi, single_time)) = results.first() {
53        println!("单线程基准: π ≈ {:.6}, 时间: {:?}", single_pi, single_time);
54        
55        for (threads, pi_val, duration) in &results[1..] {
56            let speedup = single_time.as_secs_f64() / duration.as_secs_f64();
57            println!("{}线程: π ≈ {:.6}, 时间: {:?}, 加速比: {:.2}x", 
58                     threads, pi_val, duration, speedup);
59        }
60    }
61    
62    println!("\n🎯 理论π值: 3.141592653589793");
63    println!("📱 手机并行计算测试完成!");
64}

同时需要在 Cargo.toml 中添加依赖,cargo add rayon rand num_cpus

1[package]
2name = "mobile-pi-calculator"
3version = "0.1.0"
4edition = "2021"
5
6[dependencies]
7rayon = "1.8"
8rand = "0.8"
9num_cpus = "1.16"

在手机上运行,效果如下:

 1cargo build --release
 2./target/release/hello_cargo
 3📱 手机CPU并行计算演示
 4🔢 计算π值 (10M 采样点)
 5🔧 检测到 8 个CPU核心
 6🎯 Threads: 1, Time: 415.965937ms, π ≈ 3.142158
 7🎯 Threads: 2, Time: 284.113594ms, π ≈ 3.141996
 8🎯 Threads: 3, Time: 234.696094ms, π ≈ 3.141445
 9🎯 Threads: 4, Time: 181.711719ms, π ≈ 3.141939
10🎯 Threads: 5, Time: 203.050312ms, π ≈ 3.141030
11🎯 Threads: 6, Time: 141.51ms, π ≈ 3.141340
12🎯 Threads: 7, Time: 140.900625ms, π ≈ 3.142074
13🎯 Threads: 8, Time: 141.51375ms, π ≈ 3.142262
14📊 性能分析:
15单线程基准: π ≈ 3.142158, 时间: 415.965937ms
162线程: π ≈ 3.141996, 时间: 284.113594ms, 加速比: 1.46x
173线程: π ≈ 3.141445, 时间: 234.696094ms, 加速比: 1.77x
184线程: π ≈ 3.141939, 时间: 181.711719ms, 加速比: 2.28x
195线程: π ≈ 3.141030, 时间: 203.050312ms, 加速比: 2.04x
206线程: π ≈ 3.141340, 时间: 141.51ms, 加速比: 2.93x
217线程: π ≈ 3.142074, 时间: 140.900625ms, 加速比: 2.94x
228线程: π ≈ 3.142262, 时间: 141.51375ms, 加速比: 2.93x
23🎯 理论π值: 3.141592653589793
24📱 手机并行计算测试完成!

还是挺好玩的啊!

小贴士

Termux下面我都用nano来简单编辑文件,都是通过Github把文件编写完成,Termux那边直接git pull,然后cmake一套,或者cargo一套。

Termux可以打开storage,就能直接访问手机的Documents/Downloads,也还挺方便。打开的方式是在Termux下面运行:

1termux-setup-storage

这样,在Termux下面,就能直接访问手机的多个文件夹,位置在~/storage


文章标签

|-->termux |-->coding |-->android


GitHub