2014-04-23 16 views
6

Có một số cách để thực hiện đa luồng. std::thread cuối cùng được đưa ra theo tiêu chuẩn C++ 11 nhưng thay vào đó, boost::thread có thể được sử dụng hiệu quả. Mỗi công nghệ có cú pháp cụ thể và các công cụ, nhưng - gần - được sử dụng cho lập trình song song CPU. Nhưng chúng có hiệu ứng khác nhau. Tôi biết rằng, ví dụ, MPI và OpenMP được sử dụng cho các mô hình bộ nhớ khác nhau.Làm thế nào để các chủ đề OpenMP, MPI, POSIX, std :: thread, boost :: thread tương quan?

Tôi cũng biết rằng sự lựa chọn công nghệ không thực sự độc quyền nên có thể sử dụng một công nghệ khác (một lần nữa, MPI và OpenMP). Làm thế nào đến chúng được sử dụng cho hiệu ứng khác nhau nhưng vẫn làm việc với cùng một nguồn (CPU)?

Sự khác biệt sẽ là gì (từ hệ điều hành và quan điểm phần cứng) nếu tôi biên dịch chương trình C++ với tính song song dựa trên từng công nghệ đó? Chẳng hạn, OpenMP hoặc std::thread có sử dụng các chủ đề POSIX không? Nếu vậy, các chuỗi C++ 11 hoạt động như thế nào trên Windows? Hay mỗi công nghệ này làm việc trực tiếp với CPU thông qua ngôn ngữ lắp ráp hay gì đó?

+2

Trộn OpenMP với một mô hình luồng khác, ví dụ: 'std :: thread', không phải là hành vi được chỉ định. Nó không bị cấm một cách rõ ràng trong đặc tả. nhưng vẫn cho dù nó hoạt động hay không là rất cụ thể thực hiện. Kết hợp MPI với OpenMP hoặc mô hình luồng khác là tốt, miễn là MPI được khởi tạo đúng với sự hỗ trợ cho các luồng. –

Trả lời

9

Hệ điều hành cung cấp các luồng (syscalls để tạo chủ đề mới; dịch vụ lên lịch).

Unix libc có trình bao bọc xung quanh các chuỗi hệ điều hành với nhiều chức năng hữu ích (như mutexes, vars cond, v.v.). Thông thường giao diện bên ngoài của các thư viện hệ thống như vậy là "các chủ đề POSIX" (các chức năng có tên là pthread_*): http://en.wikipedia.org/wiki/POSIX_Threads

Windows có API luồng cứng khó sử dụng (WINAPI's CreateThread, v.v ...). Nhưng cũng có những hàm bao quanh Windows API để có được một cái gì đó giống như POSIX Các luồng api (ví dụ như có thư viện như vậy cho mingw32 và Cygwin; kiểm tra wikipedia section)

C++ 11 std::thread, thúc đẩy của boost::thread là wrappers OS độc lập chỉ hiện đại xung quanh hệ thống luồng API. Chúng được sử dụng để tạo các chương trình di động có thể được biên dịch trên bất kỳ nền tảng được hỗ trợ nào mà không cần tạo địa chỉ #ifdef địa ngục và/hoặc viết trình bao bọc tùy chỉnh riêng xung quanh thư viện luồng hệ thống. Nếu bạn đang tạo chương trình mới, hãy cân nhắc sử dụng cách này.

Có một số trình bao bọc luồng khác, ví dụ: bao gồm trong các thư viện đồ họa như QT hoặc GTK +.

Triển khai OpenMP có thư viện hỗ trợ nội bộ (ví dụ: gcc có libgomp) sử dụng API luồng hệ thống/libc, ví dụ: libgomp sử dụng chuỗi POSIX. Một số triển khai cũng có thể bao gồm chuyển đổi luồng không gian người dùng thông qua lắp ráp (mô hình luồng M: N).

MPI không có thư viện chuỗi bên trong. MPI được sử dụng để tạo ra một số quy trình và thiết lập giao tiếp giữa chúng. Nhưng khi MPI được sử dụng trong các chương trình đa luồng, nó sẽ sử dụng một số API luồng để thực hiện đồng bộ hóa. Ví dụ, MPICH sẽ sử dụng pthreads trên Unix.

Các vấn đề liên quan