2015-09-18 13 views
5

Tôi có/cgroup/cpuset/set1. set1 có 2-5,8. Tôi muốn ràng buộc một quá trình để cpuset và sau đó pin một thread trong quá trình đó để, nói, lõi 4. Tên của cpuset và tên chủ đề và cốt lõi mà tôi nên ràng buộc các chủ đề là trong tập tin cấu hình m. Có bất kỳ API C để phân tích cú pháp cpuset? Cách chính xác để đạt được việc ghim bằng mã C là gì?Ghim một sợi vào lõi trong một cpuset qua C

+1

thể dupe của http://stackoverflow.com/questions/2563442/cpu-affinity-masks-putting-threads-on-different -cpus –

+0

Không có ngôn ngữ C/C++! Đây là hai ngôn ngữ khác nhau. – Olaf

+0

@Olaf ok. Sửa chữa để C. – Prashanth

Trả lời

5

Hãy xem các hàm pthread_setaffinity_nppthread_getaffinity_np.

Ví dụ:

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

Để biết thêm chi tiết, xem man page.

+0

tôi nghĩ rằng các chi tiết cần thiết nhất sẽ là '#define _GNU_SOURCE' lên trên':) ' –

+0

@ DavidC.Rankin Cảm ơn. Đã chỉnh sửa. – dbush

+0

Chắc chắn, lý do duy nhất tôi tìm thấy đó là bài viết của bạn khiến tôi vấp phải một phần của pthreads tôi chưa bao giờ thấy trước đây, vì vậy tôi đã đi và nhìn. Cảm ơn. –

0

Gọi hàm sau đây và chuyển bất kỳ ID lõi nào bạn muốn chuyển. Cũng từ bất cứ nơi nào bạn gọi chức năng này làm kiểm tra giá trị trả về của nó là 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; 
} 
Các vấn đề liên quan