2010-03-30 8 views
9

Để sử dụng tất cả các lõi của bộ xử lý lõi tứ, tôi cần thay đổi gì trong mã của tôi là thêm hỗ trợ đa luồng hoặc nó được quản lý bởi chính hệ điều hành. Tôi đang có FreeBSD và ngôn ngữ tôi đang sử dụng là C++. Tôi muốn cung cấp chu kỳ CPU hoàn chỉnh cho ứng dụng của mình ít nhất 90%.làm thế nào để sử dụng CPU lõi tứ trong ứng dụng

+9

Được cảnh báo. Threading là một nhức đầu và thêm hỗ trợ luồng cho một ứng dụng hiện có thậm chí còn tồi tệ hơn. – Yacoby

+7

Thông thường, cách dễ nhất để sử dụng CPU 4 nhân là chạy 4 bản sao chương trình của bạn. Nếu điều này là không thuận lợi do cơ sở dữ liệu của bạn, rất có thể là tất cả các giải pháp đề xuất cũng sẽ khó. – MSalters

+1

Bạn có thể sử dụng đồng thời dựa trên diễn viên mà không có trạng thái chia sẻ (lập trình có thể nhìn thấy) để loại bỏ nhiều đau đầu kèm theo lập trình đa luồng, nhưng điều này chỉ hoạt động nếu kiến ​​trúc của bạn có thể được mô hình hóa theo cách đó. –

Trả lời

11

Đối với các ứng dụng đa luồng trong C++, tôi có thể đề xuất Boost.Thread để giúp bạn truy cập toàn bộ tiềm năng của máy lõi tứ.

Đối với việc thay đổi mã của bạn, bạn có thể muốn xem xét việc làm mọi thứ càng bất biến càng tốt. Chuyển đổi trạng thái giữa các luồng sẽ khó gỡ lỗi hơn nhiều. Có rất nhiều thứ có khả năng xảy ra theo những cách bất ngờ. Xem this SO chủ đề.

3

Tôi nghĩ tùy chọn duy nhất của bạn là chạy một số chuỗi. Nếu ứng dụng của bạn là đơn luồng, thì nó sẽ chỉ chạy trên một trong các lõi (tại một thời điểm), nhưng nếu bạn có nhiều luồng hơn, chúng có thể chạy đồng thời.

+1

Một tùy chọn khác, như đã đề cập, chạy nhiều bản sao của cùng một chương trình. Tùy thuộc vào bản chất của vấn đề, điều này có thể hoặc có thể không dễ dàng (xem http://en.wikipedia.org/wiki/Embuggingly_parallel). – KeithB

1

Bạn cần thêm hỗ trợ cho ứng dụng của mình để thực hiện song song thông qua việc sử dụng Luồng.

Khi bạn có hỗ trợ cho tính song song, hệ điều hành có thể gán các luồng của bạn cho lõi CPU.

10

Một tùy chọn khác không được đề cập ở đây, luồng sang một bên, là sử dụng OpenMP sẵn có thông qua -fopenmp và thư viện libgomp, cả hai đều đã cài đặt trên hệ thống FreeBSD 8 của tôi.

Chúng cung cấp cho bạn #pragma chỉ thị để song song các vòng nhất định, trong khi các câu lệnh, v.v. tức là các bit bạn có thể song song. Nó sẽ chăm sóc luồng và liên kết cpu cho bạn. Lưu ý nó là một giải pháp chung và do đó có thể không phải là cách tối ưu để song song, nhưng nó sẽ cho phép bạn song song một số thói quen nhất định.

Hãy xem này: https://computing.llnl.gov/tutorials/openMP/

Đối với việc sử dụng đề/xử lý bản thân, thói quen nhất định và cách thức làm việc là đối tượng của nó. Bạn có thể phá vỡ các nhiệm vụ theo cách như vậy không? Nó có ý nghĩa để fork() quá trình của bạn hoặc tạo ra một sợi? Nếu có, hãy làm như vậy, nhưng nếu không, đừng cố ép buộc ứng dụng của bạn phải đa luồng chỉ vì. Một ví dụ tôi thường đưa ra là thuật toán ước số chung lớn nhất - nó dựa trên bước trước khi tất cả thời gian trong quá trình thực hiện truyền thống do đó khó thực hiện song song. Cũng cần lưu ý rằng đối với một số thuật toán nhất định, song song thực sự là chậm hơn cho các giá trị nhỏ của bất kỳ thứ gì bạn đang làm song song, bởi vì mặc dù các công việc hoàn thành nhanh hơn, chi phí thời gian liên kết của việc tham gia và tham gia (là chủ đề đó hoặc các quy trình) thực sự đẩy thời gian lên trên thực hiện nối tiếp.

19

Bạn need một số dạng song song. Đa luồng hoặc đa xử lý sẽ ổn.

Thông thường, nhiều đềdễ dàng hơn để xử lý (vì chúng có thể truy cập dữ liệu được chia sẻ) hơn nhiều quá trình. Tuy nhiên, thường, nhiều chủ đề khó hơn để xử lý (vì chúng truy cập dữ liệu được chia sẻ) so với nhiều quy trình . Và, vâng, tôi đã viết điều này một cách có chủ ý.

Nếu bạn có kịch bản SIMD, Ninefingers' suggestion để xem OpenMP cũng rất tốt. (Nếu bạn không biết SIMD có ý nghĩa gì, hãy xem phần bình luận hữu ích của Ninefingers dưới đây.)

+0

Có phải sự tự mâu thuẫn được cân nhắc không? Tôi đồng ý, có lợi thế/bất lợi cho cả hai ngã ba() và luồng. –

+1

Tôi nghĩ vậy. +1. –

+4

+1 cho tự mâu thuẫn :-) – Sebastian

0

Điều đầu tiên tôi nghĩ bạn nên xem là ứng dụng của bạn và các thuật toán của nó có phù hợp để thực hiện trong parellel hay không một tập hợp các tác vụ nối tiếp có thể được xử lý độc lập). Nếu đây không phải là trường hợp, nó sẽ khó khăn để đa luồng nó hoặc chia nó thành các quá trình song song, và bạn có thể cần phải nhìn vào sửa đổi cách nó hoạt động.

Khi bạn đã thiết lập rằng bạn sẽ có thể hưởng lợi từ việc xử lý song song, bạn có tùy chọn sử dụng một số quy trình hoặc chủ đề. Sự lựa chọn phụ thuộc rất nhiều vào bản chất của ứng dụng của bạn và cách các quy trình song song độc lập có thể như thế nào. Việc phối hợp và chia sẻ dữ liệu giữa các chủ đề dễ dàng hơn vì chúng nằm trong cùng một quy trình, nhưng cũng khá khó khăn hơn để phát triển và gỡ lỗi.

Boost.Thread là thư viện tốt nếu bạn quyết định đi xuống tuyến đường đa luồng.

2

Tôi muốn cung cấp chu kỳ CPU hoàn chỉnh cho ứng dụng của mình ít nhất 90%.

Tại sao? Chip của bạn không đủ nóng?

Nghiêm túc, phải mất các chuyên gia trên thế giới hàng chục thậm chí hàng trăm giờ để parallelizetải cân bằng một ứng dụng để nó sử dụng 90% của tất cả bốn lõi. CPU của bạn đã được thanh toán cho và chi phí cho dù bạn có sử dụng hay không. (Trên thực tế, chi phí ít hơn để chạy, nói bằng điện, nếu bạn không sử dụng nó.) Thời gian của bạn đáng giá bao nhiêu? Bạn sẵn sàng đầu tư bao nhiêu giờ để sử dụng hiệu quả hơn tài nguyên có thể có giá 300 đô la và có thể bạn đang ngồi nhàn rỗi hầu hết thời gian?

Có thể tăng tốc độ thông qua song song, nhưng nó là đắt tiền trong thời gian của con người. Bạn cần một lý do chính đáng để biện minh cho nó. (Học ​​như thế nào là một lý do đủ tốt.)

Tất cả sách hay mà tôi biết về lập trình song song là dành cho các ngôn ngữ khác với C++ và vì lý do chính đáng. Nếu bạn muốn các nội dung thú vị về tính song song, hãy kiểm tra Chương trình song song ngầm định trong pH hoặc Lập trình đồng thời trong ML hoặc Fortress Project.

+0

Không ai đọc câu trả lời này sẽ ngạc nhiên bởi câu trả lời của tôi cho "Làm thế nào bạn tận dụng lợi thế của đa lõi" http://stackoverflow.com/questions/363341/how-are-you-taking-advantage-of-multicore :-) –