Có thể giới hạn số lượng luồng cho C ++ 17 song song `for_each` không?


10

Tôi sử dụng std::for_eachvới std::execution::parđể thực hiện tính toán phức tạp trên đầu vào lớn được biểu diễn dưới dạng vector của các cấu trúc. Việc tính toán không cần bất kỳ độ trễ nào liên quan đến phần cứng (ví dụ IO mạng hoặc đĩa), đó là tính toán "chỉ CPU". Đối với tôi có vẻ hợp lý rằng không có ý nghĩa để tạo ra nhiều luồng hệ điều hành mà chúng ta có các phần cứng; tuy nhiên, Visual C ++ 2019 tạo ra trung bình 50 luồng và đôi khi lên tới 500 luồng thậm chí chỉ có 12 luồng phần cứng.

Có cách nào để hạn chế số luồng song song được tính hardware_concurrencyvới std::for_eachstd::execution::par, hoặc cách duy nhất để tạo số lượng luồng hợp lý là sử dụng mã tùy chỉnh với std::thread?


open-std.org/jtc1/sc22/wg21/docs/ con / 2016 / - nhưng tôi nghĩ nó vẫn là một đề xuất?
Caramiriel

1
Ngay cả khi điều này sẽ trở thành tiêu chuẩn vào một ngày nào đó, vấn đề chính của nhóm chủ đề là nó ở mức thấp hơn nhiều so với std::for_eachcác thuật toán khác từ <algorithm>tiêu đề. Ý tưởng chính đằng sau std::execution::parlà tạo mã song song gần như đơn giản như tuần tự và song song hóa các thuật toán hiện có với các thay đổi mã và ngữ nghĩa tối thiểu.
Vitalii

Câu trả lời:


5

Có thể giới hạn số lượng luồng cho C ++ 17 song song for_eachkhông?

Không, ít nhất là không có trong C ++ 17. Tuy nhiên, có một đề xuất cho executorsmột tiêu chuẩn sắp tới, về cơ bản mang đến cho bạn khả năng ảnh hưởng đến bối cảnh thực hiện (về vị trí và thời gian) cho giao diện thuật toán STL cấp cao:

thread_pool pool{ std::thread::hardware_concurrency() };
auto exec = pool.executor();
std::for_each(std::execution::par.on(exec), begin(data), end(data), some_operation);

Cho đến lúc đó, bạn phải tin tưởng nhà cung cấp trình biên dịch của mình rằng anh ta biết cái gì là tốt nhất cho hiệu năng tổng thể, ví dụ như các nhà phát triển của trạng thái Visual Studio :

Lập lịch trong việc thực hiện của chúng tôi được xử lý bởi nhóm luồng hệ thống Windows. Nhóm luồng tận dụng thông tin không có sẵn cho thư viện chuẩn, chẳng hạn như các luồng khác trên hệ thống đang làm gì, luồng xử lý tài nguyên hạt nhân nào đang chờ và tương tự. Nó chọn thời điểm để tạo thêm chủ đề và khi nào chấm dứt chúng. Nó cũng được chia sẻ với các thành phần hệ thống khác, bao gồm cả những người không sử dụng C ++.

Tùy chọn khác là từ bỏ việc chỉ dựa vào thư viện tiêu chuẩn và sử dụng các triển khai STL đã có đề xuất mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.