2015-09-18 31 views
5

Mam/cgroup/cpuset/set1. set1 ma 2-5,8. Chcę powiązać proces z tym cpuset, a następnie przypiąć wątek w tym procesie do, powiedzmy, core 4. Nazwa cpuset i nazwa wątku oraz rdzeń, do którego powinienem przywiązać wątek, znajduje się w m pliku konfiguracyjnym. Czy są jakieś API C do parsowania cpuset? Jaki jest właściwy sposób uzyskania przypinania za pomocą kodu C?Przypinanie wątku do rdzenia w cpuset przez C

+1

Możliwa dupe od http://stackoverflow.com/questions/2563442/cpu-affinity-masks-putting-threads-on-different -cpus –

+0

Nie ma języka C/C++! Są to dwa różne języki. – Olaf

+0

@Olaf ok. Poprawiony na C. – Prashanth

Odpowiedz

5

Spójrz na funkcje pthread_setaffinity_np i pthread_getaffinity_np.

przykład:

#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); 
    } 

Aby uzyskać więcej szczegółów, patrz man page.

+0

Myślę, że najbardziej potrzebnym szczegółem byłoby '#define _GNU_SOURCE' up top':) ' –

+0

@ DavidC.Rankin Dzięki. Edytowane. – dbush

+0

Pewnie, jedynym powodem, dla którego go znalazłem, był twój wpis, który spowodował, że natknąłem się na część pthreadów, których nigdy wcześniej nie widziałem, więc poszedłem i spojrzałem. Dzięki. –

0

Zadzwoń do następującej funkcji i podaj dowolny identyfikator rdzenia, który chcesz przekazać. Również z dowolnego wywołania tej funkcji należy sprawdzić jego wartość zwracana będzie 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; 
}