2015-09-18 8 views
5

Ich habe/cgroup/cpuset/set1. set1 hat 2-5,8. Ich möchte einen Prozess an diesen CPU-Satz binden und dann einen Thread in diesem Prozess an Kern 4 anheften. Der Name des CPU-Satzes und der Thread-Name und der Kern, an den ich den Thread binden soll, sind in der Konfigurationsdatei m. Gibt es C-APIs zum Parsen von CPU-Satz? Was ist der richtige Weg, um das Pinning mit C-Code zu erreichen?Einen Thread an einen Kern in einem CPU-Satz durch C fixieren

+1

Mögliche Betrogene von http://stackoverflow.com/questions/2563442/cpu-affinity-masks-putting-threads-on-different sein -cpus –

+0

Es gibt keine Sprache C/C++! Dies sind zwei verschiedene Sprachen. – Olaf

+0

@Olaf ok. Korrigiert zu C. – Prashanth

Antwort

5

Schauen Sie sich die Funktionen pthread_setaffinity_np und pthread_getaffinity_np an.

Beispiel:

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

Weitere Einzelheiten finden Sie in der man page.

+0

Ich denke, das wichtigste Detail wäre '#define _GNU_SOURCE' oben ':) ' –

+0

@ DavidC.Rankin Thanks. Bearbeitet. – dbush

+0

Sicher, der einzige Grund, warum ich es gefunden habe, war, dass dein Beitrag mich über einen Teil von Pthreads stolperte, den ich noch nie zuvor gesehen hatte, also ging ich hin und schaute. Vielen Dank. –

0

Rufen Sie die folgende Funktion auf und übergeben Sie die Kern-ID, die Sie übergeben möchten. Auch von wo auch immer Sie diese Funktion rufen Sie den Rückgabewert überprüfen 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; 
} 
Verwandte Themen