Theo OpenMP Memory Model, sau đây là sai:Truy cập vào bộ nhớ riêng của một chủ đề trong OpenMP
int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
int x;
// THREAD 0 // THREAD 1
p0 = &x; p1 = &x;
*p1 ... *p0 ...
}
dụ của tôi trông giống như sau mặc dù:
int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
int x;
// THREAD 0 // THREAD 1
p0 = &x; p1 = &x;
#pragma omp flush
#pragma omp barrier
*p1 ... *p0 ...
#pragma omp barrier
}
Điều này có thể không chính xác? Tôi không thể tìm thấy một cái gì đó trong mô hình bộ nhớ sẽ không cho phép điều này.
Tôi giả định rằng ví dụ đồ chơi của tôi là chính xác, như trong mô hình bộ nhớ trong 3.1, chúng cho phép tác vụ có quyền truy cập vào biến riêng tư miễn là người lập trình đảm bảo rằng nó vẫn còn sống. Với thực tế là các nhiệm vụ có thể được gỡ bỏ, chúng có thể trong lý thuyết thực hiện trong một chuỗi công nhân khác nhau, do đó cho phép truy cập luồng OpenMP vào bộ nhớ riêng của một luồng khác.
Tôi đang cố ghi vào không gian địa chỉ của chuỗi 0 từ chuỗi 1 và ngược lại. Tôi có thể nghĩ đến một số ứng dụng thú vị nhưng tôi chưa có một ví dụ cụ thể. Chỉ cần thử nghiệm. Lưu ý rằng tôi đang cấp cho mỗi luồng truy cập đến một bộ nhớ riêng khác. Tôi chỉ muốn biết nếu nó không được phép hoặc không được khuyến khích một cách rõ ràng; mô hình bộ nhớ OpenMP không phải là tinh thể rõ ràng và nếu tôi hiểu được sự phức tạp với pragma nhiệm vụ, thì có thể mô hình bộ nhớ không đầy đủ. – ipapadop