我正在使用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系统调用激活特定核心?
答案 0 :(得分:0)
我不认为可以激活单个核心,但它看起来像......
android : PowerManager可让您查看是否存在持续的效果模式,可以通过调用setSustainedPerformanceMode
这应该唤醒CPU供您使用。此外,WakeLocks看起来像他们警告Android你想要访问超过&#34;空闲&#34;资源。