2011-11-17 31 views
5

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.

Trả lời

1

Điều này sẽ hiệu quả. Flush đồng bộ tất cả các biến chia sẻ và bảo đảm hàng rào rằng môi trường mp với tất cả các luồng vẫn hoạt động. Miễn là bạn không sử dụng p0 trong phân công p1 hoặc ngược lại thì nó sẽ ổn thôi. Mặc dù tôi không thể tưởng tượng tại sao người ta lại làm như thế. Có lẽ bạn có thể nói thêm về lý do đằng sau cấu trúc đó.

Kể từ p0 và p1 là vẫn còn sống sau khi khu vực song song, bạn có thể làm tất cả các bài tập có cũng không có rào cản vv ..

+0

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

1

Như một ý nghĩ bên, đây là tương tự như cố gắng để đọc một biến cục bộ bên trong một số hàm bạn đã gọi bằng cách gán biến cục bộ đó cho biến toàn cầu, sau đó đọc biến toàn cục. Tương tự ở đây là một biến toàn cầu hoạt động giống như một biến chia sẻ trong đa luồng, về cơ bản cho phép truy cập vào những gì được cho là luồng riêng (giống như biến cục bộ chỉ hiển thị trong hàm).

Vì vậy, để trả lời câu hỏi như được hỏi, thực hiện dereferencing vào bộ nhớ riêng tư là hoàn toàn hợp lệ. Nó được cho phép bởi vì phép đánh dấu con trỏ được cho phép (đây là nơi mà 2 hoặc nhiều biến cung cấp quyền truy cập vào cùng một vị trí trong bộ nhớ, trong trường hợp của bạn là một số nguyên riêng và số còn lại là một con trỏ được chia sẻ).

Mặc dù hoàn toàn hợp lệ, hãy cẩn thận điều này có thể gây ra một số khó khăn trong việc phát hiện các điều kiện chủng tộc, như thường sẽ không sử dụng khóa để bảo vệ quyền truy cập vào các biến riêng tư.

+0

+1 để đề cập đến bí danh con trỏ. Tuy nhiên, nó vẫn không rõ ràng nếu những gì tôi đang làm là hợp lệ theo mô hình bộ nhớ. Nó đã làm việc cho tôi trên tất cả các trình biên dịch/nền tảng mà tôi đã sử dụng, tuy nhiên điều đó không có nghĩa là nó là chính xác. – ipapadop

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