2013-02-06 18 views
6

Tôi đã sử dụng numactl, với tùy chọn --physcpubind. hướng dẫn sử dụng nói:numactl --physcpubind

--physcpubind=cpus, -C cpus 
Only execute process on cpus. Etc... 

Giả sử tôi có NUMA hệ thống với 3 nút NUMA, trong đó mỗi nút có 4 lõi. NUMA nút 0 có 0, 1, 2, 3 là số lõi. NUMA nút 1 có 4,5,6,7 và NUMA nút 2 có 8,9,10,11. Câu hỏi của tôi là hãy nói rằng tôi chạy chương trình như sau:

export OMP_NUM_THREADS=6 
numactl --physcpubind=0,1,4,5,8,9 ./program 

tức là tôi sẽ chạy chương trình của tôi với 6 chủ đề và tôi yêu cầu họ được trên lõi CPU 0,1,4,5,8, 9. Ví dụ, nếu tại một số thời điểm trong chuỗi chương trình 0-5 được gán lõi CPU 0,1,4,5,8,9 (setup1). Có thể là tại một số điểm khác trong suốt quá trình thực thi chương trình 0 có thể chạy trên lõi CPU 9 chẳng hạn, và vân vân? I E. sẽ có sự chuyển đổi luồng giữa các lõi CPU? Hoặc các chủ đề duy nhất bị ràng buộc với lõi CPU (như trong setup1)? Cảm ơn.

+0

physcpubind phải là giao diện cho [sched_setaffinity] (http://linux.die.net/man/2/sched_setaffinity), do đó, nó sửa đổi cpuset của quy trình và tất cả chuỗi. Bất kỳ thread nào được phép chạy trên bất kỳ CPU nào từ cpuset, việc di chuyển được cho phép giữa bất kỳ CPU nào từ cpuset. Nếu bạn muốn liên kết chuỗi với CPU, hãy sử dụng sched_setaffinity hoặc pthread_setaffinity_np trực tiếp trong mỗi chuỗi. Hoặc đặt mối quan hệ thông qua thư viện OMP: http://stackoverflow.com/a/8325730/196561 ví dụ: với lệnh 'xuất OMP_PROC_BIND = true'. – osgx

+0

@osgx Cảm ơn. Bạn có thể trả lời câu hỏi này không? Cảm ơn. – tiki

Trả lời

5

physcpubind tùy chọn numactl phải là một giao diện để sched_setaffinity gọi hệ thống, mà sẽ thay đổi cpuset (bộ CPU cho phép) của quá trình này vào lúc này của quá trình khởi động. Mỗi thread sẽ có cpuset riêng, nhưng tất cả các luồng sẽ kế thừa giá trị cpuset của chúng từ quá trình cha.

Vì vậy, chủ đề được phép chạy trên bất kỳ CPU nào từ cpuset, việc di chuyển được cho phép giữa bất kỳ CPU nào từ cpuset.

Bất kỳ chủ đề nào cũng có thể gọi sched_setaffinity hoặc pthread_setaffinity_np (biến thể mối quan hệ đặc trưng của linux thay đổi cho chuỗi đơn) để thu hẹp hoặc thậm chí mở rộng cpuset của nó.

Nếu bạn muốn chuỗi liên kết với CPU, hãy sử dụng sched_setaffinity hoặc pthread_setaffinity_np trực tiếp trong mỗi chuỗi hoặc trong trường hợp mối quan hệ thiết lập OpenMP qua thư viện OMP: OpenMP and CPU affinity ví dụ: với lệnh (OpenMP 3.1+)

export OMP_PROC_BIND=true 

Tôi đoán rằng thư viện OMP sẽ chọn CPU theo cách vòng tròn từ lúc khởi tạo thư viện omp.

Đối với phiên bản cũ của libgomp - thư viện hỗ trợ OMP được sử dụng bởi GCC - bạn có thể vượt qua bộ cho phép các CPU với lệnh:

export GOMP_CPU_AFFINITY=0-1,4-5,8-9 

PS: để kiểm tra đề vị trí của bạn, bạn có thể bắt đầu top và kích hoạt "CPU cuối đã sử dụng "trường có các phím fj và bật hiển thị chuỗi với H.