gpt4 book ai didi

android - 检测是否在具有异构 CPU 架构的设备上运行

转载 作者:IT王子 更新时间:2023-10-29 00:59:29 27 4
gpt4 key购买 nike

我对这个非常具体。我需要知道设备是否有一个 CPU,它有像 ARM's big.LITTLE technology 这样的异构内核。 ,例如,一组4个ARM Cortex-A53 + 另一组4个更强大的ARM Cortex-A72,总共8个内核,基本上是同一芯片中的2个处理器。处理器型号并不重要。

我正在考虑的是读取所有内核的 scaling_max_freq 并将具有不同最大频率的那些分组(然后比较它们),但我注意到在某些设备中,通往任何内核的路径不是cpu0 实际上是/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

的符号链接(symbolic link)

也就是说,如果我尝试读取 cpu3 的 scaling_max_freq,它将链接到 cpu0 的 scaling_max_freq。我想知道在这种情况下我是否可以认为我们不是在异构环境中运行。

CPU类

public final class CPU {
// To be formatted with specific core number
private static final String CPU_DIR = "/sys/devices/system/cpu/cpu%d";
private static final String CPUFREQ_DIR = CPU_DIR + "/cpufreq";
public static final String SCALING_MAX_FREQ = CPUFREQ_DIR + "/scaling_max_freq";
private static final String DEFAULT_FREQS = "200000 400000 800000 1200000";

private CPU() {

}

// Here I'd replace 0 with (other) core number
@NonNull
public static synchronized String[] getAvailFreqs() {
String[] split;
String freqs = FileUtils.readFile(format(SCALING_AVAIL_FREQS, 0), DEFAULT_FREQS);

try {
split = freqs.split(" ");
} catch (Exception e) {
split = DEFAULT_FREQS.split(" ");
}
return split;
}

// Here I'd replace 0 with (other) core number
public static synchronized int getMaxFreq() {
try {
return Integer.parseInt(FileUtils.readFile(format(SCALING_MAX_FREQ, 0), "1200000"));
} catch (Exception ignored){}
return 1200000;
}

private static String format(String format, Object arg) {
return String.format(Locale.US, format, arg);
}
}

FileUtils 类

public final class FileUtils {

private FileUtils() {

}

public static String readFile(String pathname, String defaultOutput) {
return baseReadSingleLineFile(new File(pathname), defaultOutput);
}

public static String readFile(File file, String defaultOutput) {
return baseReadSingleLineFile(file, defaultOutput);
}

// Async
private static String baseReadSingleLineFile(File file, String defaultOutput) {
String ret = defaultOutput;
Thread thread = new Thread(() -> {
if (file.isFile() || file.exists()) {
if (file.canRead()) {
try {
FileInputStream inputStream = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = reader.readLine(); // Fisrt line
reader.close();
inputStream.close();
ret = line;
} catch (Exception ignored) {}
} else
// Uses cat command
ret = RootUtils.readFile(file, defaultOutput);
}
});
thread.start();

// 3 seconds timeout
long endTimeMillis = System.currentTimeMillis() + 3000;
while (thread.isAlive())
if (System.currentTimeMillis() > endTimeMillis)
return defaultOutput;

return ret;
}
}

最佳答案

您可以解析来自 $ cat/proc/cpuinfo 的结果,在“模型名称”中有描述:

processor   : 0
[...]
model name : Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz
[...]

processor : 1
[...]

请注意,“cpu MHz”描述的是当前频率,而不是最大值。

引用资料:

https://unix.stackexchange.com/questions/87522/why-do-cpuinfo-cur-freq-and-proc-cpuinfo-report-different-numbers

https://unix.stackexchange.com/questions/146051/number-of-processors-in-proc-cpuinfo

编辑:如果您的操作系统没有返回型号名称,BogoMips 可以用作比较单元(尽管在下面的描述中 Wikipedia 不推荐使用它)。至少您可以使用它来识别您拥有异构架构。

BogoMips (from "bogus" and MIPS) is an unscientific measurement of CPU speed made by the Linux kernel when it boots to calibrate an internal busy-loop. An often-quoted definition of the term is "the number of million times per second a processor can do absolutely nothing".

BogoMips is a value that can be used to verify whether the processor in question is in the proper range of similar processors, i.e. BogoMips represents a processor's clock frequency as well as the potentially present CPU cache. It is not usable for performance comparisons among different CPUs.

Here您可以找到 BogoMips 评级的完整列表。

关于android - 检测是否在具有异构 CPU 架构的设备上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52021688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com