2012-12-22 7 views
5

trò chơi của tôi sử dụng một kiến ​​trúc đa luồng, với các chủ đề đặt ra như thế này:Tạo nhiều chủ đề trên đơn vị cùng một phần cứng

  • chính: chịu trách nhiệm về kiến ​​trúc cao cấp
  • Resources: chịu trách nhiệm về tập tin không đồng bộ I/O
  • mạng: chịu trách nhiệm ngăn chặn mạng I/O
  • Người lao động: làm các công việc chuyên sâu CPU

Ngay bây giờ, có các chuỗi công việc (hardware_threads - 3), một cho mỗi đơn vị phần cứng không sử dụng, nhưng tôi muốn thêm một cái nữa bằng cách kết hợp chuỗi "Tài nguyên" và "Mạng" vào một đơn vị vì cả hai chủ đề sẽ chi tiêu rất nhiều thời gian không hoạt động.

  1. Điều này có thể xảy ra trong C++ với boost :: thread không?
  2. Đây có phải là một tối ưu hóa đáng giá không?
+0

* "Đây có phải là một tối ưu hóa đáng giá không?" * - có thể là không. – Pubby

+1

std :: thread nằm trong tiêu chuẩn. Hãy suy nghĩ về việc sử dụng này. –

+0

std :: thread không hoạt động đúng trên hệ thống Windows. Đó là chức năng tương tự như boost :: thread anyways, vì vậy nếu tôi cần phải chuyển đổi qua là dễ dàng. – jmegaffin

Trả lời

5

Bạn nói đúng, đây là một ý tưởng tồi. Có một chủ đề cho một thiết kế công việc có vẻ đơn giản, nhưng nó thực sự không đặc biệt khi một số công việc nặng hơn những công việc khác. Ngoài ra, bạn đã thực hiện không đủ chủ đề. Thông thường bạn muốn có một vài hơn thế để tài khoản cho slack trong chủ đề khác mà không chạy ngay bây giờ.

Vấn đề cơ bản ở đây là bạn đang triển khai chương trình phụ trợ luồng của riêng mình. Đây là một ý tưởng tồi. Bạn cần phải chuyển sang một thứ như TBB, điều này sẽ giải quyết tất cả những thứ này cho bạn, và những kỹ sư của Intel đã bỏ ra, cách định hình và làm việc lâu hơn bạn.

Vì đây có phải là tối ưu hóa đáng giá hay không, tốt, có thể là không. Chỉ cần tạo đủ công nhân và giữ cho chúng được tải, và các luồng tài nguyên/mạng đang chặn sẽ không thực sự tạo ra sự khác biệt nhiều.

+0

Đó là những gì tôi đang nghĩ. Tôi chỉ muốn biết nếu nó có giá trị ở tất cả để squeeze ra rằng đơn vị phần cứng thêm, nhưng tôi đoán không. – jmegaffin

1

Chủ đề tuyệt vời để phân phối công việc và để tránh điều gì đó đang chờ đợi điều gì đó xảy ra mà không thực sự quan trọng nếu chúng ta chờ đợi ngay bây giờ. Vì vậy, sử dụng chủ đề chắc chắn là một ý tưởng tốt cho thiết kế của bạn.

Làm thế nào để có bao nhiêu chủ đề bạn nên có, và cho dù đó là "có giá trị" có chủ đề nhiều hơn hoặc ít hơn? Đó là một câu hỏi phức tạp hơn nhiều để trả lời. Đối với các chủ đề chuyên sâu của CPU, thực sự không có điểm nào có nhiều lõi CPU trong hệ thống, vì bạn sẽ không nhận được nhiều công việc hơn bằng cách có thêm các chủ đề nữa. vì phần mềm quá phức tạp và hy vọng bạn không đạt được điều đó ...]

Đối với những thứ chờ đợi và do đó không sử dụng nhiều CPU, số lượng chủ đề sẽ nhiều hơn "bất kỳ điều gì làm cho nó dễ dàng để xử lý trong mã "- rõ ràng, có hàng ngàn có lẽ là một ý tưởng tồi, nhưng một hoặc hai hoặc ba sẽ không tạo ra nhiều sự khác biệt. Bạn rõ ràng sẽ có cùng một vấn đề với "làm thế nào để tôi nói cho các chủ đề phải làm gì tiếp theo, và khi nào tôi cần phải chờ kết quả ...", vv Một luồng nhàn rỗi không "làm" nhiều cho hệ thống hiệu suất - nó chiếm một lượng nhỏ bộ nhớ ngăn xếp và số lượng dữ liệu điều khiển luồng thậm chí nhỏ hơn, nhưng đó là một số lượng nhỏ mà nó không thực sự quan trọng nếu bạn không có số lượng khổng lồ.

Tóm lại, có lẽ là "rất nhiều tiếng la hét vì rất ít len" khi người đàn ông mù nói khi ông cắt con lợn - nói cách khác, rất nhiều công việc, không có nhiều lợi ích.

+0

Không. Bạn cần phải có nhiều chủ đề hơn vì tất cả các luồng đều chặn số lượng nhỏ - ví dụ, phân bổ bộ nhớ hoặc các cuộc gọi hệ thống. Nó thường là tốt nhất để có một vài chủ đề đã sẵn sàng để chạy mọi lúc. – Puppy

+0

Phải, tôi đã đề cập đến các chủ đề không chờ chút nào (ví dụ: chỉ nhổ ra một luồng dữ liệu và nếu một mục không được sử dụng hết, nó sẽ tiết ra một mục không phân biệt). Nhưng có, nếu có bất kỳ loại chờ đợi liên quan đến bất kỳ chủ đề, sau đó bạn cần nhiều chủ đề hơn số lượng CPU có sẵn để đảm bảo sử dụng đầy đủ của CPU. –