2015-09-18 5 views
5

I/cgroup/cpuset/set1. set1 ha 2-5,8. Voglio associare un processo a quel cpuset e quindi collegare un thread in quel processo, per esempio, al nucleo 4. Il nome del cpuset e il nome del thread e il core a cui dovrei legare il thread è nel file di configurazione m. Esistono API C per analizzare cpuset? Qual è il modo corretto per ottenere il pinning usando il codice C?Blocco di un thread in un core in un cpuset tramite C

+1

possibile vittima di http://stackoverflow.com/questions/2563442/cpu-affinity-masks-putting-threads-on-different -cpus –

+0

Non c'è linguaggio C/C++! Queste sono due lingue diverse. – Olaf

+0

@Olaf ok. Corretto a C. – Prashanth

risposta

5

Dai un'occhiata alle funzioni pthread_setaffinity_np e pthread_getaffinity_np.

Esempio:

#define _GNU_SOURCE 
    #include <pthread.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <errno.h> 

    #define handle_error_en(en, msg) \ 
      do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) 

    int 
    main(int argc, char *argv[]) 
    { 
     int s, j; 
     cpu_set_t cpuset; 
     pthread_t thread; 

     thread = pthread_self(); 

     /* Set affinity mask to include CPUs 0 to 7 */ 

     CPU_ZERO(&cpuset); 
     for (j = 0; j < 8; j++) 
      CPU_SET(j, &cpuset); 

     s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset); 
     if (s != 0) 
      handle_error_en(s, "pthread_setaffinity_np"); 

     /* Check the actual affinity mask assigned to the thread */ 

     s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset); 
     if (s != 0) 
      handle_error_en(s, "pthread_getaffinity_np"); 

     printf("Set returned by pthread_getaffinity_np() contained:\n"); 
     for (j = 0; j < CPU_SETSIZE; j++) 
      if (CPU_ISSET(j, &cpuset)) 
       printf(" CPU %d\n", j); 

     exit(EXIT_SUCCESS); 
    } 

Per maggiori dettagli, vedere la man page.

+0

penso che il dettaglio più necessario sarebbe '#define _GNU_SOURCE' in alto':) ' –

+0

@ DavidC.Rankin Grazie. Modificato. – dbush

+0

Certo, l'unica ragione per cui ho trovato che il tuo post mi ha fatto imbattersi in una parte di pthreads che non avevo mai visto prima, così sono andato a dare un'occhiata. Grazie. –

0

Chiamare la seguente funzione e passare qualsiasi ID di nucleo che si desidera passare. Anche da dove si chiama questa funzione non controllare il suo valore di ritorno per essere 1.

short CorePin(int coreID) 
{ 
    short status=0; 
    int nThreads = std::thread::hardware_concurrency(); 
    //std::cout<<nThreads; 
    cpu_set_t set; 
    std::cout<<"\nPinning to Core:"<<coreID<<"\n"; 
    CPU_ZERO(&set); 

    if(coreID == -1) 
    { 
    status=-1; 
    std::cout<<"CoreID is -1"<<"\n"; 
    return status; 
    } 

    if(coreID > nThreads) 
    { 
    std::cout<<"Invalid CORE ID"<<"\n"; 
    return status; 
    } 

    CPU_SET(coreID,&set); 
    if(sched_setaffinity(0, sizeof(cpu_set_t), &set) < 0) 
    { 
    std::cout<<"Unable to Set Affinity"<<"\n"; 
    return -1; 
    } 
    return 1; 
} 
Problemi correlati