programa permanente nucleos establecer asignar afinidad activar linux multithreading pthreads parallel-processing

linux - nucleos - establecer afinidad permanente windows 10



Máscaras de afinidad de CPU(poner subprocesos en diferentes CPU) (3)

Tengo 4 hilos, y estoy tratando de configurar el hilo 1 para que se ejecute en la CPU 1, el hilo 2 en la CPU 2, etc. Sin embargo, cuando ejecuto mi código a continuación, las máscaras de afinidad devuelven los valores correctos, pero cuando hago un sched_getcpu () en los hilos, todos devuelven que se están ejecutando en la CPU 4.

¿Alguien sabe cuál es mi problema aquí?

¡Gracias por adelantado!

#define _GNU_SOURCE #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <sched.h> #include <errno.h> void *pthread_Message(char *message) { printf("%s is running on CPU %d/n", message, sched_getcpu()); } int main() { pthread_t thread1, thread2, thread3, thread4; pthread_t threadArray[4]; cpu_set_t cpu1, cpu2, cpu3, cpu4; char *thread1Msg = "Thread 1"; char *thread2Msg = "Thread 2"; char *thread3Msg = "Thread 3"; char *thread4Msg = "Thread 4"; int thread1Create, thread2Create, thread3Create, thread4Create, i, temp; CPU_ZERO(&cpu1); CPU_SET(1, &cpu1); temp = pthread_setaffinity_np(thread1, sizeof(cpu_set_t), &cpu1); printf("Set returned by pthread_getaffinity_np() contained:/n"); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu1)) printf("CPU1: CPU %d/n", i); CPU_ZERO(&cpu2); CPU_SET(2, &cpu2); temp = pthread_setaffinity_np(thread2, sizeof(cpu_set_t), &cpu2); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu2)) printf("CPU2: CPU %d/n", i); CPU_ZERO(&cpu3); CPU_SET(3, &cpu3); temp = pthread_setaffinity_np(thread3, sizeof(cpu_set_t), &cpu3); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu3)) printf("CPU3: CPU %d/n", i); CPU_ZERO(&cpu4); CPU_SET(4, &cpu4); temp = pthread_setaffinity_np(thread4, sizeof(cpu_set_t), &cpu4); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu4)) printf("CPU4: CPU %d/n", i); thread1Create = pthread_create(&thread1, NULL, (void *)pthread_Message, thread1Msg); thread2Create = pthread_create(&thread2, NULL, (void *)pthread_Message, thread2Msg); thread3Create = pthread_create(&thread3, NULL, (void *)pthread_Message, thread3Msg); thread4Create = pthread_create(&thread4, NULL, (void *)pthread_Message, thread4Msg); pthread_join(thread1, NULL); pthread_join(thread2, NULL); pthread_join(thread3, NULL); pthread_join(thread4, NULL); return 0; }


Creo que lo más fácil sería asignar la máscara de la CPU como parámetro a cada subproceso y hacer que la solicitud de subproceso proporcione la afinidad misma, como en el ejemplo aquí: pthread_setaffinity_np(3) .


Esto es lo que estabas buscando. Sé que es una respuesta tardía, pero esto podría ayudar a otros.

#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <sched.h> #include <errno.h> #include <unistd.h> int getNumberOfCpus( void ) { long nprocs = -1; long nprocs_max = -1; # ifdef _SC_NPROCESSORS_ONLN nprocs = sysconf( _SC_NPROCESSORS_ONLN ); if ( nprocs < 1 ) { //std::cout << "Could not determine number of CPUs on line. Error is " << strerror( errno ) << std::endl; return 0; } nprocs_max = sysconf( _SC_NPROCESSORS_CONF ); if ( nprocs_max < 1 ) { //std::cout << "Could not determine number of CPUs in host. Error is " << strerror( errno ) << std::endl; return 0; } //std::cout << nprocs < " of " << nprocs_max << " online" << std::endl; return nprocs; #else //std::cout << "Could not determine number of CPUs" << std::endl; return 0; #endif } void *pthread_Message( void *ptr ) { sleep(10); char *message; message = (char *) ptr; printf("%s /n", message); cpu_set_t l_cpuSet; int l_maxCpus; int j; unsigned long l_cpuBitMask; CPU_ZERO( &l_cpuSet ); printf("get affinity %d/n",pthread_getaffinity_np(pthread_self() , sizeof( cpu_set_t ), &l_cpuSet )); // printf("cpuset %d/n",l_cpuSet); printf (" thread id %u/n", pthread_self()); if ( pthread_getaffinity_np(pthread_self() , sizeof( cpu_set_t ), &l_cpuSet ) == 0 ) for (int i = 0; i < 4; i++) if (CPU_ISSET(i, &l_cpuSet)) printf("XXXCPU: CPU %d/n", i); for (long i=0; i< 10000000000; ++i); } int main() { pthread_t thread1, thread2, thread3, thread4; pthread_t threadArray[4]; cpu_set_t cpu1, cpu2, cpu3, cpu4; const char *thread1Msg = "Thread 1"; const char *thread2Msg = "Thread 2"; const char *thread3Msg = "Thread 3"; const char *thread4Msg = "Thread 4"; int thread1Create, thread2Create, thread3Create, thread4Create, i, temp; thread1Create = pthread_create(&thread1, NULL, &pthread_Message, (void*)thread1Msg); sleep(1); thread2Create = pthread_create(&thread2, NULL, &pthread_Message, (void*)thread2Msg); sleep(1); thread3Create = pthread_create(&thread3, NULL, &pthread_Message, (void*)thread3Msg); sleep(1); thread4Create = pthread_create(&thread4, NULL, &pthread_Message, (void*)thread4Msg); CPU_ZERO(&cpu1); CPU_SET(0, &cpu1); temp = pthread_setaffinity_np(thread1, sizeof(cpu_set_t), &cpu1); printf("setaffinity=%d/n", temp); printf("Set returned by pthread_getaffinity_np() contained:/n"); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu1)) printf("CPU1: CPU %d/n", i); CPU_ZERO(&cpu2); CPU_SET(1, &cpu2); temp = pthread_setaffinity_np(thread2, sizeof(cpu_set_t), &cpu2); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu2)) printf("CPU2: CPU %d/n", i); CPU_ZERO(&cpu3); CPU_SET(2, &cpu3); temp = pthread_setaffinity_np(thread3, sizeof(cpu_set_t), &cpu3); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu3)) printf("CPU3: CPU %d/n", i); CPU_ZERO(&cpu4); CPU_SET(3, &cpu4); temp = pthread_setaffinity_np(thread4, sizeof(cpu_set_t), &cpu4); for (i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &cpu4)) printf("CPU4: CPU %d/n", i); // pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpu1); // pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpu1); pthread_join(thread1, NULL); pthread_join(thread2, NULL); pthread_join(thread3, NULL); pthread_join(thread4, NULL); return 0; }


Está intentando establecer la afinidad de los hilos que no inicializó.

Editar: Ok, déjame darte más información:

No mezcle identificadores de subprocesos (lo que almacena en la variable pthread_t) y lo que representan (un subproceso de ejecución que se ejecuta en algún lugar). Lo que intentaba hacer es establecer una propiedad de un hilo antes de que comience, con una API que requiere el objeto de hilo. Da la casualidad que pthread_create crea el objeto e inicia la ejecución al mismo tiempo, por lo que intentar usar pthread_setaffinity_np no es el camino correcto (esto es útil si quieres cambiar la afinidad de un hilo actualmente en ejecución).

Pero ... pthread_create tiene un parámetro de atributo (le está pasando NULL). Esto almacena la información de cómo quieres que se cree el hilo.

La afinidad es uno de los atributos que puede establecer a través de ese parámetro. Consulte la documentación de la página man para pthread_attr_init y pthread_attr_setaffinity_np para ver exactamente cómo