2011-01-06 41 views
5

Trong một hàm thành viên, tôi có thể parallelize bằng cách sử dụng biến thành viên chia sẻ int *x như thế nàyTại sao biến thành viên lớp x không được phép chia sẻ (x) trong OpenMP?

#pragma omp parallel for default(shared) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

Nhưng nếu tôi cố gắng

#pragma omp parallel for default(none) shared(x,size) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

tôi nhận được lỗi: 'obj::x' is not a variable in clause 'shared'. Tôi thích phiên bản thứ hai vì nó thông báo các biến được chia sẻ mà nó đang làm việc, nhắc tôi để đảm bảo không có điều kiện chủng tộc hoặc các vấn đề tương tự.

Điều gì đang diễn ra mà OpenMP tuyên bố rằng obj::x không phải là một biến?

+0

bạn đã thử điều này-> x chưa? bạn cũng sử dụng trình biên dịch nào? – Beanz

+0

trình biên dịch là g ++ 4.4. Thử '#pragma omp song song cho mặc định (none) được chia sẻ (this-> x, size)' cho lỗi 'error: expected unqualified-id trước 'this'' –

Trả lời

11

Hầu hết các triển khai của OpenMP phác thảo khu vực song song. Nghĩa là, chúng biến nó thành một chức năng. Các biến riêng thường được chuyển đến hàm này và các biến chia sẻ có thể được chuyển hoặc nằm trong phạm vi của hàm. Vấn đề với các thành viên của lớp dữ liệu là chúng không giống như các biến.

Khi trình biên dịch phác thảo một vùng song song, các biến có vị trí lưu trữ được xác định rằng trình biên dịch có thể thiết lập để chuyển cho hàm. Các thành viên dữ liệu có thể không được khởi tạo (tức là, lưu trữ được cấp phát) cho đến khi lớp được gọi trong khi thực hiện chương trình. Điều này có nghĩa là trình biên dịch không thể tự tư nhân hóa các thành viên dữ liệu. Nó cũng sẽ phải được thực hiện trong thời gian chạy và điều này sẽ gây ra nhiều công việc hơn và sẽ ảnh hưởng đến hiệu suất của cả hai chương trình nối tiếp và song song. Cho đến nay không thực hiện đã cố gắng để làm công việc này và kể từ khi spec OpenMP được viết bởi sự đồng thuận quyết định đã được thực hiện để không cho phép các thành viên dữ liệu trong tất cả các điều khoản. Nếu không, có vẻ như quá khó hiểu khi nói rằng chúng được cho phép trong các mệnh đề được chia sẻ, nhưng không có mệnh đề nào khác.

1

Không biết precisiely - nhưng hãy xem qua 32 OpenMP traps for C++ developers để phân loại ra hầu hết các vấn đề OpenMP

+1

Cảm ơn bạn đã liên kết! –

+0

Tôi không tìm thấy bất kỳ tham chiếu nào đến câu hỏi của tôi trong tài liệu được liên kết. Bạn có thể cụ thể hơn không? –

+0

Xin lỗi tôi không có câu trả lời chính xác, tôi hy vọng sẽ có nội dung nào đó trong liên kết giúp bạn –

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