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
Trả lời
Hãy xem các hàm pthread_setaffinity_np
và pthread_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.
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':) ' –
@ DavidC.Rankin Cảm ơn. Đã chỉnh sửa. – dbush
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. –
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;
}
- 1. Silverlight - Thêm đinh ghim vào Bản đồ Bing qua C#
- 2. Phân tách hạt nhân thành một lõi cụ thể Sử dụng Cpuset
- 3. C#: Dừng một sợi sau khi một ngoại lệ
- 4. Silverlight - Thêm văn bản vào đinh ghim trong Bản đồ Bing qua C#
- 5. Đang cập nhật DataGridView qua một sợi khi di chuyển
- 6. Ghim một RelayCommand
- 7. Thoát khỏi một sợi
- 8. Tạo ra một sợi chỉ trong python
- 9. Làm thế nào để chặn hoàn toàn một sợi trong một đối tượng trong C#
- 10. Làm thế nào để chấm dứt một sợi công nhân một cách chính xác trong C#
- 11. Gọi một hàm trong một sợi nền/quá trình (forking)
- 12. Lấy WPF phối ngay trong một sợi
- 13. Khóa trong một sợi, nhả ra một số khác
- 14. Dừng một sợi bên trong một dịch vụ
- 15. Làm thế nào để giết một sợi trong delphi?
- 16. Xác định nguồn của một sợi
- 17. MVVM Windows Phone 8 - thêm một bộ sưu tập các đinh ghim vào một bản đồ
- 18. Ghim một ô trong UICollectionView ngang sang bên phải
- 19. C++ Atomics và tầm nhìn chéo sợi
- 20. Đi qua một cấu trúc để một hàm trong C
- 21. Chạy một sợi nền trên Swift 3
- 22. Process sinh ra thông qua Process.Start trong .NET treo sợi
- 23. C# lặp qua một mảng
- 24. nhập khẩu bên trong của một sợi Python
- 25. Thay đổi độ trễ của một sợi trong threadpool
- 26. Ngủ một sợi chỉ tăng cho một số nano giây
- 27. Nhanh chóng thêm ghim đơn vào MKMapView?
- 28. không thể gọi một sợi trong tập tin dll
- 29. C# Task có chạy trên một lõi không?
- 30. ios ghi vào đĩa trên sợi nền
thể dupe của http://stackoverflow.com/questions/2563442/cpu-affinity-masks-putting-threads-on-different -cpus –
Không có ngôn ngữ C/C++! Đây là hai ngôn ngữ khác nhau. – Olaf
@Olaf ok. Sửa chữa để C. – Prashanth