Chúng ta nên dành bao nhiêu nỗ lực để lập trình cho nhiều lõi?


12

Bộ xử lý ngày càng nhiều lõi hơn trong những ngày này, khiến tôi tự hỏi ...

Chúng ta có nên, các lập trình viên, thích nghi với hành vi này và dành nhiều nỗ lực hơn cho lập trình cho nhiều lõi?

Đến mức độ nào chúng ta nên làm và tối ưu hóa điều này? Chủ đề? Sự giống nhau? Tối ưu hóa phần cứng? Thứ gì khác?

Câu trả lời:


15

Cho dù bạn có giỏi đến đâu, chắc chắn bạn sẽ không nghĩ ra một kế hoạch quản lý luồng tốt hơn, v.v. so với các nhóm phát triển ngôn ngữ và trình biên dịch mà bạn đang viết mã.

Nếu bạn cần ứng dụng của mình đa luồng thì hãy tạo các luồng bạn cần và để trình biên dịch và HĐH bắt đầu với công việc của chúng.

Bạn cần phải biết cách quản lý các luồng đó để bạn có thể sử dụng tốt nhất các tài nguyên. Không tạo ra quá nhiều chủ đề là một điều khiến người ta phải suy nghĩ.

Bạn cũng cần lưu ý về những gì đang diễn ra (xem bình luận của Lorenzo) để bạn có thể đưa ra gợi ý cho quản lý luồng (hoặc ghi đè lên nó trong các trường hợp đặc biệt), nhưng tôi đã nghĩ rằng những điều này sẽ rất ít.


3
Nhưng một luồng liên tục nhảy từ lõi này sang lõi khác sẽ bị phạt hiệu năng (do bỏ qua bộ đệm CPU cấp một và cấp hai), đặc biệt là trong các kiến ​​trúc nơi sử dụng hai khuôn vật lý riêng biệt. Trong mã chuyên sâu đa luồng, ái lực là một điều tốt.
Wizard79

@Lorenzo - Trong trường hợp đó, bạn sẽ cần phải xem liệu bạn có thể buộc sợi chỉ vào một lõi hay không - có lẽ là một trường hợp đặc biệt - nhưng là một trường hợp thú vị.
ChrisF

1
Sẽ không phải là một động thái khá kỳ lạ đối với hệ điều hành để bối cảnh chuyển một luồng hoạt động từ lõi này sang lõi khác?
JBRWilkinson

Tôi đồng ý với @JBRWilkinson, mối quan hệ luồng có vẻ như là một công việc hệ điều hành đối với tôi.
Collin

1
@JBRWilkinson Dưới linux (và tôi nghĩ rằng hầu hết các hệ điều hành) đều nhảy giữa các lõi mọi lúc. Lý do đầu tiên là bạn có nhiều chủ đề tổng thể hơn lõi. Và nếu một số chủ đề chết thì bạn cần phải cân bằng. Lý do thứ hai là nhiều chủ đề đang ngủ. Và khi một số nhân thức dậy, hạt nhân có thể nghĩ rằng một lõi có tải nhiều hơn các lõi khác và di chuyển một luồng, thường là luồng điện toán cpu của bạn. Sau đó, 2 luồng cpu chạy trên cùng một lõi cho đến khi kernel di chuyển trở lại. Nếu bạn đang chia một công việc lớn thành các phần chính xác thì bạn muốn đặt mối quan hệ luồng.
Goswin von Brederlow

5

Tôi là một lập trình viên .NET và tôi biết rằng .NET có sự trừu tượng hóa ở mức độ cao cho đa luồng được gọi là Nhiệm vụ. Nó bảo vệ bạn khỏi phải biết quá nhiều về cách thực hiện đa luồng thích hợp đối với kim loại. Tôi giả định rằng các nền tảng phát triển hiện tại khác có sự trừu tượng tương tự. Vì vậy, nếu bạn sẽ làm bất cứ điều gì với đa luồng, tôi sẽ cố gắng làm việc ở cấp độ đó nếu có thể.

Bây giờ, đối với câu hỏi bạn thậm chí có nên quan tâm đến đa luồng trong ứng dụng cụ thể của bạn. Câu trả lời cho câu hỏi đó phụ thuộc rất nhiều vào ứng dụng bạn đang viết. Nếu bạn đang viết một ứng dụng xử lý hàng ngàn (hoặc nhiều hơn) những thứ độc lập và việc xử lý này có thể được thực hiện song song, thì bạn gần như chắc chắn sẽ có được lợi thế từ đa luồng. Tuy nhiên, nếu bạn đang viết một màn hình nhập dữ liệu đơn giản, đa luồng có thể không mua cho bạn nhiều.

Ít nhất, bạn cần quan tâm đến đa luồng khi bạn đang làm việc trên một giao diện người dùng. Bạn không muốn thực hiện thao tác chạy dài từ UI và khiến nó không phản hồi vì bạn đã chiếm quyền điều khiển UI để thực hiện thao tác đó. Tắt một luồng nền và ít nhất cung cấp cho người dùng nút Hủy để họ không phải đợi nó hoàn thành nếu họ mắc lỗi.


5

Ở vùng đất của Objective-C và Mac OS X và iOS, các khung (giống như nhiều khung khác) được viết để tận dụng các mức tăng này trong lõi xử lý và cung cấp cho nhà phát triển một giao diện đẹp để sử dụng chúng.

Ví dụ trên Mac OS X và iOS là công văn Grand Central. Có những bổ sung libc(tôi tin) để tạo điều kiện cho đa luồng dựa trên hàng đợi. Sau đó, khung Cacao và Foundation (trong số các khung khác) được viết trên GCD, giúp nhà phát triển dễ dàng truy cập để gửi hàng đợi và xâu chuỗi với rất ít mã nồi hơi.

Nhiều ngôn ngữ và khung có khái niệm tương tự.


5

Phần khó là tất cả trong việc phân tách thuật toán chuyên sâu CPU của bạn thành các khối thực thi có thể được xâu chuỗi.

Sau đó, một luồng liên tục nhảy từ lõi này sang lõi khác sẽ bị phạt hiệu năng (do bỏ qua bộ đệm CPU cấp một và cấp hai), đặc biệt là trong các kiến ​​trúc nơi sử dụng hai khuôn vật lý riêng biệt. Trong trường hợp này mối quan hệ chủ đề lõi là một điều tốt.


3

Chúng ta đang ở đây (tháng 10 năm 2010) trong thời kỳ chuyển đổi lớn.

Hôm nay chúng ta có thể mua một máy tính để bàn 12 lõi.
Hôm nay chúng ta có thể mua một thẻ xử lý lõi 448 (tìm kiếm NVidia Tesla).

Có những giới hạn đối với số lượng nhà phát triển của chúng tôi có thể làm việc trong sự thiếu hiểu biết về các môi trường song song cực lớn mà các chương trình của chúng tôi sẽ hoạt động trong tương lai gần.

Hệ điều hành, môi trường thời gian chạy và thư viện lập trình chỉ có thể làm rất nhiều.

Trong tương lai, chúng ta sẽ cần phân vùng xử lý thành các phần riêng biệt để xử lý độc lập, sử dụng các tóm tắt như "Khung công tác" .NET mới.

Các chi tiết như quản lý bộ đệm và mối quan hệ vẫn sẽ có mặt - nhưng chúng sẽ chỉ là sự chứng minh của ứng dụng siêu hiệu quả. Không có nhà phát triển nào sẽ muốn quản lý các chi tiết này theo cách thủ công trên máy lõi 10k.


3

tốt, nó thực sự phụ thuộc vào những gì bạn đang phát triển. câu trả lời, tùy thuộc vào những gì bạn đang phát triển, có thể từ "nó không đáng kể" đến "nó hoàn toàn quan trọng và chúng tôi hy vọng mọi người trong nhóm sẽ hiểu rõ và sử dụng các triển khai song song".

đối với hầu hết các trường hợp, một sự hiểu biết vững chắc và sử dụng các khóa, luồng, nhiệm vụ và nhóm nhiệm vụ sẽ là một khởi đầu tốt khi cần phải có sự song song. (thay đổi theo lang / lib)

thêm vào đó là sự khác biệt trong các thiết kế bạn phải thực hiện - đối với đa xử lý không cần thiết, người ta thường phải học một số mô hình lập trình mới hoặc các chiến lược song song. trong trường hợp đó, thời gian để học, để không đủ thời gian để có một sự hiểu biết vững chắc và để cập nhật các chương trình hiện có có thể mất một năm một nhóm (hoặc hơn). một khi bạn đã đạt đến điểm đó, bạn sẽ (hy vọng!) sẽ không giải quyết hoặc tiếp cận các vấn đề / triển khai như bạn làm hôm nay (miễn là bạn chưa thực hiện chuyển đổi đó).

một trở ngại khác là bạn đang tối ưu hóa hiệu quả một chương trình cho một thực thi nhất định. nếu bạn không được dành nhiều thời gian để tối ưu hóa các chương trình, thì bạn thực sự sẽ không được hưởng lợi từ nó nhiều như bạn nên. song song hóa mức cao (hoặc rõ ràng) có thể cải thiện tốc độ nhận được của chương trình của bạn với khá ít nỗ lực và đó là điều mà nhiều đội sẽ làm hôm nay: "Chúng tôi đã song song hóa các phần thực sự rõ ràng của ứng dụng" - trong một số trường hợp thì tốt. lợi ích của việc lấy quả treo thấp và sử dụng song song đơn giản sẽ tương xứng với số lượng lõi? thông thường, khi có hai đến bốn lõi logic nhưng không thường xuyên vượt quá điều đó. trong nhiều trường hợp, đó là một khoản hoàn trả chấp nhận được, với khoản đầu tư thời gian. mô hình song song này được nhiều người giới thiệu để thực hiện việc sử dụng song song tốt.

những gì bạn học được bằng cách sử dụng các mô hình song song tầm thường này sẽ không lý tưởng trong tất cả các kịch bản song song phức tạp; áp dụng hiệu quả các thiết kế song song phức tạp đòi hỏi một sự hiểu biết và cách tiếp cận khác nhau. các mô hình đơn giản này thường được tách ra hoặc có tương tác nhỏ với các thành phần khác của hệ thống. đồng thời, nhiều triển khai của các mô hình tầm thường này không mở rộng tốt cho các hệ thống song song phức tạp hiệu quả - một thiết kế song song phức tạp xấu có thể mất nhiều thời gian để thực hiện như mô hình đơn giản. ill: nó thực thi nhanh gấp đôi so với mô hình luồng đơn, trong khi sử dụng 8 lõi logic trong khi thực thi. hầu hết các ví dụ comon đang sử dụng / tạo quá nhiều luồng và mức độ nhiễu đồng bộ hóa cao. nói chung, điều này được gọi là chậm lại song song. nó khá dễ gặp phải nếu bạn tiếp cận tất cả các vấn đề song song như các vấn đề đơn giản.

vì vậy, giả sử bạn thực sự nên sử dụng đa luồng hiệu quả trong các chương trình của mình (thiểu số, trong khí hậu ngày nay): bạn sẽ cần sử dụng mô hình đơn giản một cách hiệu quả để tìm hiểu mô hình phức tạp và sau đó học lại cách bạn tiếp cận dòng chảy và tương tác của chương trình. mô hình phức tạp là nơi chương trình của bạn cuối cùng sẽ xuất hiện vì đó là nơi có phần cứng ngày nay và là nơi cải tiến vượt trội nhất sẽ được thực hiện.

việc thực hiện các mô hình đơn giản có thể được hình dung như một ngã ba và các mô hình phức tạp hoạt động giống như một hệ sinh thái phức tạp, uh. Tôi nghĩ rằng sự hiểu biết về các mô hình đơn giản, bao gồm khóa chung và phân luồng sẽ sớm hoặc sẽ được mong đợi bởi các nhà phát triển trung gian khi tên miền (nơi bạn phát triển) sử dụng nó. hiểu các mô hình phức tạp ngày nay vẫn còn hơi bất thường (trong hầu hết các lĩnh vực), nhưng tôi nghĩ rằng nhu cầu sẽ tăng khá nhanh. với tư cách là nhà phát triển, phần lớn các chương trình của chúng tôi sẽ hỗ trợ các mô hình này và hầu hết việc sử dụng đều bị bỏ lại khá xa trong việc hiểu và thực hiện các khái niệm này. vì số lượng bộ xử lý logic là một trong những lĩnh vực quan trọng nhất của cải tiến phần cứng, nên nhu cầu cho những người hiểu và có thể thực hiện các hệ thống phức tạp chắc chắn sẽ tăng lên.

cuối cùng, có rất nhiều người nghĩ rằng giải pháp chỉ là "thêm song song". thông thường, tốt hơn là làm cho việc thực hiện hiện tại nhanh hơn. nó dễ dàng hơn nhiều và đơn giản hơn nhiều trong nhiều trường hợp. nhiều chương trình trong tự nhiên chưa bao giờ được tối ưu hóa; một số người chỉ có ấn tượng rằng phiên bản không được tối ưu hóa sẽ bị lu mờ bởi phần cứng một ngày nào đó. cải thiện thiết kế hoặc thuật toán của các chương trình hiện có cũng là một kỹ năng quan trọng nếu hiệu suất là quan trọng - ném nhiều lõi hơn vào các vấn đề không nhất thiết là giải pháp tốt nhất hoặc đơn giản nhất.

Khi nhắm mục tiêu vào các máy tính hiện đại, hầu hết chúng ta, những người cần triển khai các hệ thống song song tốt sẽ không cần phải vượt ra ngoài đa thư viện, khóa, thư viện song song, đáng đọc sách và rất nhiều kinh nghiệm viết và kiểm tra chương trình (về cơ bản, tái cấu trúc đáng kể cách bạn tiếp cận chương trình viết).


2

Chúng tôi làm, nhưng chúng tôi viết phần mềm nặng tính toán để chúng tôi hưởng lợi trực tiếp từ nhiều lõi.

Đôi khi bộ lập lịch di chuyển các chủ đề giữa các lõi rất nhiều. Nếu điều đó không được chấp nhận, bạn có thể chơi với mối quan hệ cốt lõi.


0

Vì thế, tần số bộ xử lý sẽ không tăng trong tương lai gần. Chúng tôi bị kẹt xung quanh mốc 3 GHz (w / o ép xung). Chắc chắn, đối với nhiều ứng dụng, có thể không cần thiết phải vượt ra ngoài đa luồng rất cơ bản. Rõ ràng nếu bạn đang xây dựng một ứng dụng giao diện người dùng, bất kỳ xử lý chuyên sâu nào cũng nên được thực hiện trên một luồng nền.

Nếu bạn đang xây dựng một ứng dụng đang xử lý lượng dữ liệu khổng lồ phải theo thời gian thực, thì có, bạn có lẽ nên xem xét lập trình đa luồng.

Đối với lập trình đa luồng, bạn sẽ thấy rằng bạn sẽ nhận được lợi nhuận giảm dần về hiệu suất của bạn; bạn có thể dành hàng giờ và cải thiện chương trình thêm 15%, sau đó dành thêm một tuần nữa và chỉ cải thiện thêm 5% nữa.

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.