gpt4 book ai didi

android - Android 中的线程亲和性与 C 程序

转载 作者:行者123 更新时间:2023-11-30 17:38:32 25 4
gpt4 key购买 nike

我在线程亲和性方面遇到了奇怪的问题。我在C中创建了一个程序:

#define _GNU_SOURCE
#include<stdio.h>
#include <sys/syscall.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include <time.h>
#include <errno.h>
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)


#define NANOS 1000000000LL
#define SIZE 1000

void* mesaureTime(void *cpu)
{
unsigned long i = 0;
int s;
cpu_set_t cpuset;
struct timespec start, end;
long elapsed;
pthread_t id = pthread_self();
CPU_ZERO(&cpuset);
CPU_SET(*(int *) cpu, &cpuset);
s = pthread_setaffinity_np(id, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_setaffinity_np");

if(pthread_equal(id,tid[0]))
printf("Realizando test...\n");

while(i<SIZE){
clock_gettime(CLOCK_MONOTONIC, &start);
// Do some calculation.
factorial(150000);
clock_gettime(CLOCK_MONOTONIC, &end);
arrayTimes[i] = elapsed;
elapsed = end.tv_nsec - start.tv_nsec + (end.tv_sec - start.tv_sec)*NANOS;
i++;
}
printf("Finished\n");
return 0;
}


int factorial(int a){

if (a==1){
return 1;
}else{
a=a*factorial(a-1);
}
return a;
}

int main(int argc, char *argv[])
{
int i = 0;
int err, result;
int *cpu_pointer;
int cpu = atoi(argv[1]);
cpu_pointer = &cpu;

err = pthread_create(&tid[i], NULL, mesaureTime, (void *) cpu_pointer);

if (err != 0)
printf("can't create thread :[%s]", strerror(err));
else
printf("Hilo de test creado satisfactoriamente\n");
pthread_join(tid[0], NULL);
printf("\n Finalizado el test\n");
return 0;
}

此代码在运行 Ubuntu 的双核 Intel CPU 中运行良好,但是当我使用 arm-linux-gnueabi-gcc 编译它并在我的 Android 设备(Nexus 4、Nexus 5 和 S4)中执行时,该程序无法在 CPU 2、CPU 3 或 CPU 4 中分配线程,它仅在 CPU 1 中工作。对于 CPU 2、3 或 4,pthread_setaffinity_np 函数始终返回错误(无效参数)。

我在这里阅读了一些问题Is it possible to set affinity with sched_setaffinity in Android?Android set thread affinity 。我已经尝试过,但得到了相同的结果。

最佳答案

以下描述来自manual关于此错误:

   EINVAL (pthread_setaffinity_np()) cpuset specified a CPU that was
outside the set supported by the kernel. (The kernel
configuration option CONFIG_NR_CPUS defines the range of the
set supported by the kernel data type used to represent CPU
sets.)

因此,您当前的内核似乎已使用 CONFIG_NR_CPUS = 1 进行配置/构建。这似乎是您的程序无法设置与线程的关联性以在计算机的其他核心上运行的原因。

您可能需要重新编译内核才能实现此目的。

关于android - Android 中的线程亲和性与 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22099101/

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