2011-11-30 35 views
5

Nói rằng tôi có chương trình c sau:làm thế nào để buộc chương trình ac để chạy trên một lõi riêng

#include <stdio.h> 

int main() 
{ 
    printf("Hello world \n"); 
    getchar(); 

    return 0; 
} 

gcc 1.c -o helloworld 

và nói rằng tôi có một máy lõi kép:

cat /proc/cpuinfo | grep processor | wc -l 

Bây giờ câu hỏi của tôi là , khi chúng tôi thực hiện chương trình, làm cách nào để chúng tôi buộc chương trình này chạy trong lõi-0 (hoặc bất kỳ lõi cụ thể nào khác)?

Làm cách nào để thực hiện điều này theo chương trình? ví dụ, api, tham chiếu mã sẽ hữu ích.

Nếu không có sẵn api thì có bất kỳ thời gian biên dịch, thời gian liên kết, thời gian tải nào để thực hiện việc này không?

OTOH, cách kiểm tra xem chương trình có đang chạy trong lõi-0 hay lõi-1 (hoặc bất kỳ lõi nào khác) không?

+1

Điều này không nằm trong phạm vi C. Bạn phải kiểm tra tài liệu của hệ điều hành để xem liệu hệ điều hành có hiển thị một tính năng như vậy hay không. –

+1

Trong Linux, bạn có thể thiết lập ái lực bằng cách sử dụng taskset, tôi đồng ý với Kerrek rằng đây là câu hỏi hệ thống vận hành –

+0

Trong khi bạn có thể sử dụng taskset để thiết lập mối quan hệ cốt lõi của quá trình khởi chạy sau đó, anh ta yêu cầu api và cách thực hiện nó lập trình – hirschhornsalz

Trả lời

5

Vì bạn đang nói về/proc/cpu, tôi cho rằng bạn đang sử dụng Linux. Trong linux, bạn sẽ sử dụng hàm sched_setaffinity. Trong ví dụ của bạn, bạn sẽ gọi

cpu_set_t set; 
CPU_ZERO(&set);  // clear cpu mask 
CPU_SET(0, &set);  // set cpu 0 
sched_setaffinity(0, sizeof(cpu_set_t), &set); // 0 is the calling process 

Tra cứu man sched_setaffinity để biết thêm chi tiết.

3

Đây là hệ điều hành cụ thể. Như Felice chỉ ra, bạn có thể làm điều đó trên Linux bằng cách gọi sched_setaffinity trong chương trình của bạn. Tuy nhiên, nếu bạn kết thúc chạy trên nhiều nền tảng, bạn sẽ phải mã hóa một cái gì đó khác nhau cho mỗi nền tảng.

Ngoài ra, bạn có thể chỉ định mối quan hệ khi bạn khởi chạy thực thi của bạn, từ dòng lệnh hoặc tập lệnh chạy hoặc bất kỳ điều gì. Xem taskset để có công cụ dòng lệnh Linux để thực hiện việc này.

Các vấn đề liên quan