Tôi đã xem xét các định nghĩa chính thức, nhưng tôi vẫn còn khá bối rối.Làm thế nào là firstprivate và lastprivate khác với các điều khoản riêng trong OpenMP?
firstprivate
: Chỉ định rằng mỗi chuỗi phải có phiên bản biến riêng, và biến phải được khởi tạo bằng giá trị của biến, bởi vì nó tồn tại trước cấu trúc song song.
Với tôi, điều đó nghe có vẻ rất riêng tư. Tôi đã tìm kiếm các ví dụ, nhưng tôi dường như không hiểu làm thế nào nó đặc biệt hoặc làm thế nào nó có thể được sử dụng.
lastprivate
: Chỉ định rằng phiên bản bối cảnh kèm theo của các biến được đặt tương ứng với phiên bản riêng của bất cứ thread thực thi lặp thức (đối với vòng lặp cấu trúc) hoặc phần cuối (phần #pragma).
Tôi cảm thấy như tôi hiểu cái 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 lastprivate
cho phép i
để được trả lại bên ngoài vòng lặp như giá trị cuối cùng.
Tôi mới bắt đầu học OpenMP ngay hôm nay.
Đây là một câu trả lời tuyệt vời! Cảm ơn nhiều! – SaiyanGirl
Vâng, tôi muốn nói, 'firstprivate' và' lastprivate' là những trường hợp đặc biệt của 'private'. Bạn thường không cần sử dụng 'private' (chỉ định nghĩa biến bên trong khối song song), có thể che khuất phạm vi bên ngoài. Thú vị là việc sử dụng các đối tượng C++ như các biến 'firstprivate' tự động - chúng sẽ được khởi tạo thông qua sao chép, xây dựng, một lần và bị phá hủy sau khối, và bạn không cần phải biết số lượng luồng trước - nhiều bản sao sẽ được tạo khi cần. –
Ví dụ tuyệt vời như vậy! Thích nhất. Đánh giá cao Hristo. – Fusionmate