2013-08-02 39 views
13

Tôi đang cố gắng song song một chương trình C bằng cách sử dụng OpenMP.Sự khác biệt giữa OpenMP luồng riêng tư và riêng tư

Tôi muốn biết thêm về:

  1. Sự khác biệt giữa threadprivate chỉ thị và mệnh đề tin
  2. Trong đó trường hợp chúng ta phải sử dụng bất kỳ trong số họ.

Theo như tôi biết, sự khác biệt là phạm vi toàn cầu với threadprivate và giá trị được bảo tồn trên các vùng song song. Tôi tìm thấy trong một số ví dụ rằng khi một đoạn mã chứa một số biến toàn cầu/tĩnh phải được tư nhân hóa, các biến này được bao gồm trong danh sách threadprivate và giá trị ban đầu của chúng được sao chép vào các bản sao riêng tư bằng cách sử dụng copyin.

Tuy nhiên, có quy tắc nào ngăn chúng tôi sử dụng mệnh đề riêng tư để xử lý các biến toàn cầu/tĩnh không? có lẽ bất kỳ chi tiết thực hiện nào?

Tôi không thể tìm thấy bất kỳ lời giải thích nào trong đặc tả OpenMP3.0.

Trả lời

17

Sự khác biệt quan trọng nhất bạn phải ghi nhớ:

  • Một biến private là địa phương đến một khu vực và sẽ hầu hết thời gian được đặt trên chồng. Tuổi thọ của sự riêng tư của biến là khoảng thời gian được xác định trong điều khoản phạm vi dữ liệu. Mỗi luồng (bao gồm chuỗi chủ) tạo một bản sao riêng của biến ban đầu (biến mới không còn được lưu trữ liên quan đến biến ban đầu).

  • Một biến threadprivate mặt khác sẽ được rất có thể đặt trong đống hoặc trong thread local storage (có thể được xem như là một ký ức toàn cầu địa phương to a thread). Biến số threadprivate tồn tại trên các vùng (tùy thuộc vào một số hạn chế). Luồng chủ sử dụng biến ban đầu, tất cả các luồng khác tạo một bản sao riêng của biến ban đầu (biến chủ vẫn là liên kết lưu trữ với biến ban đầu).


  • Ngoài ra còn có sự khác biệt phức tạp hơn:

    • biến định nghĩa là private là không xác định cho mỗi thread khi vào cấu trúc và biến chia sẻ tương ứng là undefined khi song song xây dựng được thoát; trạng thái ban đầu của con trỏ private là không xác định.

    • Nhưng dữ liệu trong các khối chung threadprivate nên được giả định là không xác định khi nhập vào vùng song song đầu tiên trừ khi mệnh đề copyin được chỉ định.Khi một khối chung xuất hiện trong chỉ thị threadprivate, mỗi bản sao luồng được khởi tạo một lần trước khi sử dụng lần đầu tiên.

  • Các OpenMP Specifications (phần 2.14.2) thực sự cung cấp một mô tả rất tốt (và cũng detailled hơn) của chỉ thị threadprivate:

    Mỗi bản sao của một biến threadprivate được khởi tạo một lần, trong cách thức được chương trình chỉ định, nhưng tại một điểm không xác định trong chương trình trước tham chiếu đầu tiên tới bản sao đó. Việc lưu trữ tất cả các bản sao của biến số threadprivate được giải phóng theo cách các biến tĩnh được xử lý bằng ngôn ngữ cơ bản, nhưng tại một điểm không xác định trong chương trình.

    Chương trình trong đó một chuỗi tham chiếu đến một bản sao của một biến khác của một biến số threadprivate không phù hợp.

    Nội dung của biến số threadprivate có thể thay đổi trên một điểm lập lịch tác vụ nếu chuỗi thực hiện chuyển sang tác vụ khác thay đổi biến. Để biết thêm chi tiết về lập lịch tác vụ, xem Phần 1.3 ở trang 14 và Mục 2.11 trên trang 113.

    Trong vùng parallel, tham chiếu theo chuỗi chính sẽ là bản sao của biến trong chuỗi gặp phải khu vực parallel.

    Trong phần tham chiếu phần tuần tự sẽ là bản sao của biến ban đầu của biến. Giá trị của dữ liệu trong bản sao của chuỗi ban đầu của biến số threadprivate được đảm bảo tồn tại giữa hai tham chiếu liên tiếp với biến trong chương trình.

    Các giá trị của dữ liệu trong threadprivate biến của đề phi ban đầu được đảm bảo để tồn tại giữa hai liên tiếp hoạt động parallel vùng chỉ khi tất cả các điều kiện sau giữ:

    • Cả parallel khu vực được lồng vào bên trong rõ ràng khác parallel khu vực.

    • Số lượng các chuỗi được sử dụng để thực thi cả hai khu vực parallel đều giống nhau.

    • Chính sách ái lực chủ đề được sử dụng để thực thi cả hai khu vực parallel đều giống nhau.

    • Giá trị của dyn-var biến kiểm soát nội bộ trong khu vực nhiệm vụ kèm theo là sai tại entry cho cả parallel khu vực.

    Nếu những điều kiện tất cả các tổ chức, và nếu một biến threadprivate được tham chiếu trong cả hai khu vực, sau đó đề với số chủ đề tương tự tại các khu vực tương ứng của họ sẽ tham khảo cùng một bản sao của biến đó.

+0

Cảm ơn bạn đã trả lời nhanh và liên kết! Vì vậy, tôi có thể kết luận những điều sau đây?: 1) Trong trường hợp tôi cần tư nhân hóa dữ liệu tự động, tôi nên sử dụng mệnh đề ** riêng ** và 2) Trong trường hợp tôi cần tư nhân hóa dữ liệu phạm vi toàn cầu, phạm vi toàn cầu; Tôi nên sử dụng chỉ thị ** threadprivate **. –

+0

@ L30nardoSV: Ý của bạn là gì với "dữ liệu tự động"? –

+0

Tôi có nghĩa là biến địa phương. –

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