我可以使用 CPU 的物理套接字 ID 来确定它属于 ARM big.LITTLE SoC 上的哪个集群吗?

我可以使用 CPU 的物理套接字 ID 来确定它属于 ARM big.LITTLE SoC 上的哪个集群吗?

我目前正在尝试从用户空间确定 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 核心数量。

相关内容