我目前正在尝试从用户空间确定 big.LITTLE 架构的每个 cpu 集群中的 cpu 数量。
我正在查看 sysfs 上的文件,看看其中是否有任何文件可以提供我需要的信息。我注意到它/sys/devices/system/cpu/cpuX/uevent
可以为我提供该 cpu id 的处理器类型,因此我可以通过解析它来获取集群大小。
该文件是这样给出的:
OF_NAME=cpu
OF_FULLNAME=/cpus/cpu@100
OF_TYPE=cpu
OF_COMPATIBLE_0=arm,cortex-a53
OF_COMPATIBLE_1=arm,armv8
OF_COMPATIBLE_N=2
MODALIAS=cpu:类型:aarch64:feature:,0000,0001,0002,0003,0004, 0005,0006,0007
我可以在哪里解析这个名字皮质-a53然后用它定义集群,因为另一个集群将有皮质-a73反而。但这似乎只是为了找出簇大小而需要做很多工作。
在查看 时/sys/devices/system/cpu/cpuX/topology
,我注意到这些physical_package_id
映射完全符合我的架构中的核心分布:6 个小核心和 2 个大核心。
搜索了一下,发现physical_package_id代表cpu所属的物理socket。
我可以通过查看某个核心的物理插槽来确定该核心属于 big.LITTLE 架构的哪个集群吗?
编辑:我运行这个脚本来找出CPU拓扑:
CPU_NUMBER=$(cat /proc/cpuinfo | awk '/^processor/{print $3}' | wc -l)
LAST_INDEX="$(($CPU_NUMBER-1))"
for i in $(seq 0 $LAST_INDEX)
do
echo "Core $i: "
cat /sys/devices/system/cpu/cpu$i/topology/physical_package_id
done
答案1
在翻阅linux源代码之后。我相信我的假设是正确的,据我所知,他们似乎使用physical_package_id来识别集群中的集群big.LITTLE 架构的驱动程序在以下两种方法中。
static inline int raw_cpu_to_cluster(int cpu)
{
return topology_physical_package_id(cpu);
}
static inline int cpu_to_cluster(int cpu)
{
return is_bL_switching_enabled() ?
MAX_CLUSTERS : raw_cpu_to_cluster(cpu);
}
然后使用它以另一种方法获取频率表,这也是我想做的事情的一部分:
static int bL_cpufreq_init(struct cpufreq_policy *policy)
{
u32 cur_cluster = cpu_to_cluster(policy->cpu);
/* Some code here */
policy->freq_table = freq_table[cur_cluster];
/* Some more code here */
}
所以我相信我可以通过查看每个集群的physical_package_id 来计算每个集群中的CPU 核心数量。