Các chương trình tuyên bố rằng chúng không thân thiện với nhiều người khác


17

Thỉnh thoảng bạn thấy cụm từ này hoặc tương tự bị đá, nói chung đề cập đến một chương trình tuyên bố rằng chúng không được thiết kế để tận dụng tối đa lợi thế của bộ xử lý đa lõi. Điều này là phổ biến đặc biệt với lập trình trò chơi video. (tất nhiên rất nhiều chương trình không có sự tương tranh và không cần nó, chẳng hạn như các tập lệnh cơ bản, v.v.).

Làm sao có thể? Rất nhiều chương trình (đặc biệt là các trò chơi) vốn đã sử dụng đồng thời và do HĐH chịu trách nhiệm lập lịch tác vụ trên CPU, vậy các chương trình này vốn không tận dụng được nhiều lõi có sẵn? Điều này có nghĩa là gì trong "bối cảnh" tận dụng nhiều lõi "? Có phải các nhà phát triển này thực sự cấm lập kế hoạch nhiệm vụ hệ điều hành và buộc mối quan hệ hoặc lập kế hoạch riêng của họ? (Âm thanh như một vấn đề ổn định lớn).

Tôi là một lập trình viên Java, vì vậy có lẽ tôi đã không phải đối phó với điều này do sự trừu tượng hoặc không có gì.


11
Một khả năng lớn là các phím tắt đã được thực hiện trong quá trình đồng bộ hóa, hoạt động cho một hệ thống xử lý đơn / lõi nhưng phá vỡ sự tương tranh thực sự của nhiều bộ xử lý / lõi.
Bart van Ingen Schenau 27/214

@BartvanIngenSchenau: Điều này đúng. Bạn nên mở rộng điều này và đăng nó như một câu trả lời. Tôi nghĩ rằng tất cả những người khác đã bỏ lỡ điểm.
kevin cline

1
Tôi nghĩ rằng @Bart thực sự gần gũi. Tuy nhiên, s / công việc / xuất hiện để làm việc / và nó sẽ gần hơn với nhãn hiệu.
Ben Voigt

như một bên - tôi đã có kinh nghiệm về điều này với tư cách là người dùng chứ không phải là lập trình viên - Ground Control 2 trên windows XP. Tôi cần phải thiết lập mối quan hệ cốt lõi chỉ với một lõi trên hệ thống đa lõi để nó chạy đúng, nếu không tất cả các hoạt hình (thực hiện toàn bộ trò chơi) sẽ chạy ở tốc độ 10 lần, trong khi một thử thách nhiều hơn đã gây khó chịu sau một thời gian . Tôi chưa từng làm bất kỳ công việc nào trên các trò chơi nhưng theo suy nghĩ của tôi, một số phần của trò chơi dường như chỉ dựa vào bộ xử lý chỉ thực hiện một số lượng công việc nhất định cùng một lúc.
jammypeach

Câu trả lời:


28

Đồng thời tốt đòi hỏi nhiều hơn là ném một vài luồng trong một ứng dụng và hy vọng điều tốt nhất. Có một phạm vi trong cách đồng thời một chương trình có thể đi từ song song lúng túng sang tuần tự thuần túy. Bất kỳ chương trình cụ thể nào cũng có thể sử dụng luật của Amdahl để diễn tả mức độ có thể mở rộng của một vấn đề hoặc thuật toán. Một vài bằng cấp cho một ứng dụng song song đáng xấu hổ sẽ là:

  • Không có trạng thái chia sẻ, mọi chức năng chỉ phụ thuộc vào các tham số được truyền vào
  • Không có quyền truy cập vào các thiết bị vật lý (card đồ họa, ổ cứng, v.v.)

Có những bằng cấp khác, nhưng chỉ với hai điều này, chúng ta có thể hiểu tại sao các trò chơi nói riêng không dễ như bạn nghĩ để tận dụng nhiều lõi. Đối với một, mô hình của thế giới sẽ được kết xuất phải được chia sẻ dưới dạng các chức năng khác nhau tính toán vật lý, chuyển động, áp dụng trí tuệ nhân tạo, vv Thứ hai, mỗi khung hình của mô hình trò chơi này phải được hiển thị trên màn hình bằng thẻ đồ họa.

Công bằng mà nói, nhiều nhà sản xuất trò chơi sử dụng các công cụ trò chơi được sản xuất bởi các bên thứ ba. Phải mất một thời gian, nhưng các công cụ trò chơi của bên thứ ba này hiện đang song song hơn nhiều so với trước đây.

Có những thách thức kiến ​​trúc lớn hơn trong việc xử lý đồng thời hiệu quả

Đồng thời có thể có nhiều hình thức, từ chạy các tác vụ trong nền đến hỗ trợ kiến ​​trúc đầy đủ cho đồng thời. Một số ngôn ngữ cung cấp cho bạn các tính năng tương tranh rất mạnh như ERLANG , nhưng nó đòi hỏi bạn phải suy nghĩ rất khác về cách bạn xây dựng ứng dụng của mình.

Không phải mọi chương trình thực sự cần sự phức tạp của hỗ trợ đa lõi đầy đủ. Một ví dụ như vậy là phần mềm thuế, hoặc bất kỳ ứng dụng định hướng nào. Khi hầu hết thời gian của bạn dành cho việc chờ đợi người dùng làm việc gì đó, sự phức tạp của các ứng dụng đa luồng chỉ là không hữu ích.

Một số ứng dụng cho vay một giải pháp song song đáng xấu hổ hơn, chẳng hạn như các ứng dụng web. Trong trường hợp này, nền tảng bắt đầu song song lúng túng và tùy thuộc vào bạn không phải áp đặt tranh chấp luồng.

Điểm mấu chốt:

Không phải tất cả các ứng dụng đều thực sự bị tổn thương do không tận dụng được nhiều luồng (và do đó, lõi). Đối với những người bị tổn thương bởi điều đó, đôi khi các tính toán không thân thiện với xử lý song song hoặc chi phí để phối hợp nó sẽ làm cho ứng dụng trở nên dễ vỡ hơn. Thật không may, xử lý song song vẫn không dễ dàng như nó phải làm tốt.


Đây là một phân tích tuyệt vời. Một điều khiến tôi băn khoăn là quan điểm của bạn về các chương trình trong thế giới thực thường không song song lúng túng và do đó khó song song: Mặc dù có thể không thể làm điều tương tự song song, nhưng có thể rất dễ thực hiện song song các việc khác nhau ( ví dụ: trong một kiến ​​trúc đường ống hoặc với một luồng UI riêng).
amon

8
Vấn đề thực sự là bạn cần thiết kế để thực hiện song song và nếu bạn không bị hạn chế bởi sự thiếu thiết kế của mình. Tôi đồng ý rằng thể rất dễ dàng thực hiện song song các việc khác nhau, nhưng không phải nếu đó là một ứng dụng hiện có với kỳ vọng cao của người dùng. Trong trường hợp đó, nó rất có thể cần viết lại để làm cho nó có thể. Viết lại vốn dĩ rất mạo hiểm, nhưng đôi khi bạn có thể đưa ra một lập luận tốt cho họ. Tôi đã thực hiện một vài lần viết lại như vậy để tối đa hóa xử lý song song trong khi bảo tồn càng nhiều mã càng tốt. Có rất nhiều yếu tố tiềm ẩn.
Berin Loritsch

Câu trả lời chính xác. Có thể đáng nhấn mạnh rằng không chỉ có thể có lợi nhuận giảm dần khi song song hóa một số hệ thống, mà một số thực tế có thể trở nên chậm hơn do chi phí cần thiết để làm cho chúng song song. Cụ thể, rất nhiều semaphores / khóa và chuyển đổi ngữ cảnh có thể có tác động bất lợi đến thời gian chạy. Chuyển đổi bối cảnh cụ thể có thể làm giảm hiệu quả của bộ đệm, đây là một mối quan tâm không hề nhỏ nếu bạn đang ở điểm tối ưu hóa hệ thống của mình. Ví dụ cụ thể của OP về các công cụ trò chơi khiến tôi nhớ lại việc nghe nhiều hơn về việc tối ưu hóa bộ nhớ đệm hơn là truy cập song song.
Gankro

35

Rất nhiều chương trình (đặc biệt là game) vốn đã sử dụng đồng thời,

Không, thực sự đó là điều ngược lại. Hầu hết các ứng dụng được viết theo một tư duy luồng đơn và nhà phát triển không bao giờ thực hiện các thay đổi cần thiết để hỗ trợ đồng thời.

Trong C, C ++ và C #, bạn cần thông báo rõ ràng cho ứng dụng để bắt đầu các luồng và / hoặc tiến trình mới.

Tôi nghĩ rằng bạn đang tập trung quá nhiều vào việc lên lịch cho các luồng và không đủ để xử lý dữ liệu trong các luồng tiềm năng. Chia sẻ dữ liệu qua các luồng và / hoặc quy trình yêu cầu một số hình thức đồng bộ hóa. Nếu bạn thay đổi một ứng dụng để sử dụng nhiều luồng nhưng không có sự đồng bộ hóa đó thì có khả năng bạn sẽ gặp rất nhiều khó khăn để theo dõi các lỗi trong mã.

Đối với các ứng dụng đa luồng mà tôi đã làm việc, tôi thường không bao giờ lo lắng về việc gửi và chỉ về đồng bộ hóa dữ liệu. Lần duy nhất tôi phải lo lắng về công văn là khi tôi đang theo đuổi các điều kiện cuộc đua do đồng bộ hóa dữ liệu không chính xác.

Nói chung, khi một ứng dụng nói rằng nó không thể sử dụng nhiều lõi thì điều đó có nghĩa là chúng không có đồng bộ hóa để bảo vệ thao tác dữ liệu.


Điều này đúng ngay cả đối với các chương trình hiện đại mới từ nhà phát triển / nhà xuất bản lớn? Khi tôi ngồi xuống và viết một chương trình, một trong những điều đầu tiên trong giai đoạn thiết kế tôi nghĩ đến là tôi có cần đồng thời không? Bởi vì nó có thể dẫn đến một thiết kế khác biệt mạnh mẽ. Các trò chơi đặc biệt phải có một số mức độ đồng thời, nếu không trò chơi sẽ đóng băng khi một trong số hàng ngàn mô hình trên màn hình cố gắng làm điều gì đó ...?
SnakeDoc

5
@SnakeDoc - Tôi nghĩ bạn đang nhầm lẫn tên miền của mình ở đó. Các công ty trò chơi lớn chắc chắn viết với sự đồng thời trong tâm trí, nhưng tôi chưa thấy một trò chơi từ một trò chơi lớn không hỗ trợ đồng thời. Các ứng dụng và trò chơi tôi đã thấy rằng không thể hỗ trợ đồng thời thường là từ các cửa hàng nhỏ hơn / nhà phát triển cá nhân nơi họ sẽ không bắt đầu với suy nghĩ đó. Và tại một số thời điểm trong sự phát triển của ứng dụng, nó trở nên không thể đạt được sự đồng thời sau khi thực tế. Và một số ứng dụng không bao giờ có ý định làm đủ để biện minh cho việc đồng thời.

Và cũng có một số trò chơi phát triển mạnh về nội dung mới (đồ họa và lối chơi), mà không phải cập nhật công cụ trò chơi (thực thi mã). Do đó, công cụ trò chơi có thể chậm hơn nhiều năm về công nghệ.
rwong

6
@SnakeDoc: Bạn không cần đồng thời để xử lý hàng ngàn mô hình trên màn hình. Nó không giống như mọi đối tượng trong trò chơi của bạn cần chủ đề riêng để mô phỏng nó; một luồng có thể xử lý các cập nhật cho mọi thứ trên màn hình trên mỗi dấu thời gian.
user2357112 hỗ trợ Monica

13

Đây không phải là quá nhiều về nhiều lõi vì nó là về nhiều luồng. HĐH có thể lên lịch cho một luồng để chạy trên bất kỳ lõi nào mà nó thích và việc lập lịch trình này là minh bạch cho chương trình đang được lên lịch. Tuy nhiên, nhiều chương trình không được viết bằng nhiều luồng, vì vậy chúng chỉ có thể chạy trên một lõi cùng một lúc.

Tại sao tôi lại viết một chương trình đơn luồng? Chúng dễ viết hơn và dễ gỡ lỗi hơn: một điều xảy ra sau một điều khác (thay vì nhiều điều xảy ra cùng một lúc và có thể xảy ra theo cách khác). Hoặc chương trình của bạn có thể không nhắm mục tiêu các máy đa lõi (như trường hợp của các trò chơi cũ). Trong một số trường hợp, một chương trình đa luồng thậm chí có thể chạy chậm hơn phiên bản một luồng nếu chi phí từ chuyển mạch ngữ cảnh và giao tiếp giữa các luồng vượt xa tốc độ đạt được khi thực hiện song song (một số phần của chương trình có thể không song song).


8

Đây không phải là một câu trả lời đầy đủ. Đó là một câu chuyện cảnh báo.

Một ngày nọ, tôi nghĩ rằng tôi sẽ cho các sinh viên trong khóa học lập trình đồng thời của mình một bản tóm tắt song song. Quicksort nên song song tốt, tôi nghĩ. Tôi đã sử dụng hai chủ đề. Chạy nó trên máy tính lõi đơn của tôi. Kết quả là:

  • 14 giây cho một phiên bản đơn luồng.
  • 15 giây cho phiên bản 2 luồng.

Đây là về những gì tôi mong đợi.

Sau đó, tôi đã thử nó trên một máy lõi kép mới hơn.

  • 11 giây cho phiên bản đơn luồng.
  • 20 giây cho phiên bản 2 luồng.

Hai chủ đề chia sẻ một hàng các nhiệm vụ còn lại. Có vẻ như các trường của đối tượng hàng đợi được xáo trộn qua lại giữa bộ đệm của lõi này và bộ đệm khác.


2
Bạn đã kiểm tra bao nhiêu phần tử mảng? Có lẽ sự hợp nhất sẽ phù hợp hơn vì lập trình đa lõi sẽ cần phải sao chép dữ liệu để tránh xung đột dòng bộ đệm?
rwong

2
@rwong Có 10.000.000 phần tử mảng. Chắc chắn sáp nhập sẽ song song tốt. Nếu tôi sử dụng sắp xếp hợp nhất, có lẽ tôi sẽ không học được một bài học hữu ích.
Theodore Norvell

1
@ArlaudPierre Tôi sẽ xem xét song song bất kỳ thuật toán nào. Quicksort rất thú vị khi bạn có thể sử dụng phương pháp túi tác vụ cho nó. Vì các nhiệm vụ là độc lập, nên trực giác của tôi là một ví dụ về sự song song lúng túng. Tôi nên đề cập rằng, sau một chút điều chỉnh, nó thực sự đã tăng tốc lên gần 2.
Theodore Norvell

1
@Jules Câu trả lời là cân bằng tải. Ngoài ra tôi muốn viết nó theo cách làm cho số lượng chủ đề dễ thay đổi. Cách tiếp cận của bạn khái quát độc đáo với sức mạnh của 2, nhưng không tốt cho số lượng chủ đề khác.
Theodore Norvell

2
@MaciejPiechotka Đạo đức là khá nhiều tất cả những điều mà bạn đề nghị. Nhưng khi trở lại OP, tôi nghĩ đạo đức phù hợp nhất là các chương trình đa luồng thực sự có thể chạy chậm hơn (nhiều) trên kiến ​​trúc đa lõi so với trên bộ xử lý lõi đơn, trừ khi nỗ lực đã được sử dụng để đảm bảo khác.
Theodore Norvell
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.