सी

2015-09-18 4 views
5

के माध्यम से एक cpuset में कोर को थ्रेड पिन करना मेरे पास/cgroup/cpuset/set1 है। सेट 1 में 2-5,8 है। मैं उस cpuset को एक प्रक्रिया को बांधना चाहता हूं और उसके बाद उस प्रक्रिया में एक थ्रेड पिन कर सकता हूं, कहें, कोर 4। Cpuset और थ्रेड नाम का नाम और जिस कोर को मैं थ्रेड बांधना चाहता हूं वह एम कॉन्फ़िगरेशन फ़ाइल में है। क्या cpuset पार्स करने के लिए कोई सी एपीआई है? सी कोड का उपयोग कर पिनिंग हासिल करने का सही तरीका क्या है?सी

+1

http://stackoverflow.com/questions/2563442/cpu-affinity-masks-putting-threads-on-different के संभावित शिकार -cpus –

+0

कोई भाषा सी/सी ++ नहीं है! ये दो अलग-अलग भाषाएं हैं। – Olaf

+0

@ ओलाफ ठीक है। सी – Prashanth

उत्तर

5

pthread_setaffinity_np और pthread_getaffinity_np फ़ंक्शंस पर एक नज़र डालें।

उदाहरण:

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

अधिक जानकारी के लिए man page देखते हैं।

+0

को ठीक किया गया है, मुझे लगता है कि सबसे आवश्यक विवरण '_DNU_SOURCE' ऊपर ऊपर' होगा ')' –

+0

@ डेविडसी। रैंकिन धन्यवाद। संपादित। – dbush

+0

निश्चित रूप से, एकमात्र कारण मैंने पाया कि यह आपकी पोस्ट थी, जो मुझे पहले कभी नहीं देखा था, इसलिए मैंने देखा और देखा। धन्यवाद। –

0

निम्न फ़ंक्शन को कॉल करें और जो भी कोर आईडी आप पास करना चाहते हैं उसे पास करें। भी आप इस फ़ंक्शन को कॉल जाँच करते हैं से भी अपनी वापसी मूल्य होने के लिए 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; 
}