我正在使用 android-ndk-15c 开发 C++ 代码,并尝试在具有 10 个 ARM 核心的处理器上可用的特定核心上运行线程(并非所有核心都相同;Big.little 架构)。然而,并非所有核心始终处于活动状态。如果我尝试使用不活动的 cpu 调用 sched_setaffinity,该调用将返回错误消息。这是示例代码。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
void getCpus() {
cpu_set_t my_set;
int syscallres = sched_getaffinity(0, sizeof(cpu_set_t), &my_set);
if( syscallres ) {
int err = errno;
printf("Error in the syscall getaffinity: err=%d\n", err);
}
for(unsigned cpu = 0; cpu < 10; cpu++ ) {
if( CPU_ISSET(cpu, &my_set) ) {
printf( "cpu %d available!!\n", cpu );
}
}
}
void setCpu( int cpu ) {
cpu_set_t my_set;
CPU_ZERO(&my_set);
CPU_SET( cpu, &my_set);
int syscallres = sched_setaffinity(0, sizeof(cpu_set_t), &my_set);
if( syscallres ) {
int err = errno;
printf("Error in the syscall setaffinity: cpu=%d err=%d\n", cpu, err);
}
}
int main () {
getCpus();
setCpu(3);
}
输出示例:
cpu 0 available!!
cpu 1 available!!
Error in the syscall setaffinity: cpu=3 err=22
cpu 3 处于活动状态时的另一个输出(不是由于我的代码;android 可能会根据负载激活一些核心)。
cpu 0 available!!
cpu 1 available!!
cpu 2 available!!
cpu 3 available!!
cpu 4 available!!
如何通过ndk系统调用激活特定核心?
我不认为单个核心可以被激活,但看起来......
android:PowerManager允许您查看是否存在持续性能模式,可以通过调用
setSustainedPerformanceMode
在Window上设置该模式
这应该会唤醒 CPU 供您使用。另外,WakeLocks 看起来像是警告 Android 您想要访问的不仅仅是“空闲”资源。