Firstprivate và lastprivate khác với các điều khoản private trong OpenMP như thế nào?


78

Tôi đã xem xét các định nghĩa chính thức, nhưng tôi vẫn khá bối rối.

firstprivate: Chỉ định rằng mỗi luồng phải có phiên bản riêng của một biến và biến đó phải được khởi tạo với giá trị của biến, vì nó tồn tại trước cấu trúc song song.

Đối với tôi, điều đó nghe có vẻ giống như chuyện riêng tư. Tôi đã tìm kiếm các ví dụ, nhưng dường như tôi không hiểu nó đặc biệt như thế nào hoặc làm thế nào nó có thể được sử dụng.

lastprivate: Chỉ định rằng phiên bản của biến ngữ cảnh bao quanh được đặt bằng phiên bản riêng của bất kỳ luồng nào thực hiện lặp lại cuối cùng (cấu trúc vòng lặp for) hoặc phần cuối cùng (# phầnpragma).

Tôi cảm thấy mình hiểu điều này tốt hơn một chút vì ví dụ sau:

#pragma omp parallel
{
   #pragma omp for lastprivate(i)
      for (i=0; i<n-1; i++)
         a[i] = b[i] + b[i+1];
}
a[i]=b[i];

Vì vậy, trong ví dụ này, tôi hiểu rằng lastprivatecho phép itrả về bên ngoài vòng lặp như giá trị cuối cùng của nó.

Tôi mới bắt đầu học OpenMP hôm nay.

Câu trả lời:


156

privatecác biến không được khởi tạo, tức là chúng bắt đầu bằng các giá trị ngẫu nhiên giống như bất kỳ biến tự động cục bộ nào khác (và chúng thường được triển khai bằng cách sử dụng các biến tự động trên ngăn xếp của mỗi luồng). Lấy chương trình đơn giản này làm ví dụ:

Với bốn luồng, nó xuất ra một cái gì đó như:

thread 0: i = 0
thread 3: i = 32717
thread 1: i = 32717
thread 2: i = 1
i = 10

(another run of the same program)

thread 2: i = 1
thread 1: i = 1
thread 0: i = 0
thread 3: i = 32657
i = 10

Điều này chứng tỏ rõ ràng rằng giá trị của ilà ngẫu nhiên (không được khởi tạo) bên trong vùng song song và bất kỳ sửa đổi nào đối với nó sẽ không hiển thị sau vùng song song (tức là biến giữ nguyên giá trị của nó từ trước khi vào vùng).

Nếu iđược tạo firstprivate, thì nó được khởi tạo với giá trị mà nó có trước vùng song song:

thread 2: i = 10
thread 0: i = 10
thread 3: i = 10
thread 1: i = 10
i = 10

Vẫn ikhông nhìn thấy các sửa đổi đối với giá trị của bên trong vùng song song sau nó.

Bạn đã biết về lastprivate(và nó không thể áp dụng cho chương trình trình diễn đơn giản vì nó thiếu các cấu trúc chia sẻ công việc).

Vì vậy, có, firstprivatelastprivatechỉ là những trường hợp đặc biệt của private. Kết quả đầu tiên là đưa các giá trị từ bối cảnh bên ngoài vào vùng song song trong khi kết quả thứ hai chuyển các giá trị từ vùng song song sang bối cảnh bên ngoài. Cơ sở lý luận đằng sau các lớp chia sẻ dữ liệu này là bên trong vùng song song tất cả các biến riêng đều che khuất các biến từ ngữ cảnh bên ngoài, tức là không thể sử dụng phép toán gán để sửa đổi giá trị bên ngoài của itừ bên trong vùng song song.


5

firstprivatelastprivatechỉ là những trường hợp đặc biệt của private.

Kết quả đầu tiên là đưa các giá trị từ bối cảnh bên ngoài vào vùng song song trong khi kết quả thứ hai chuyển các giá trị từ vùng song song sang bối cảnh bên ngoài.


bạn có thể cung cấp bất kỳ tài liệu tham khảo về nó?
J. Chomel
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.