2011-01-06 106 views
5

在一個成員函數,我可以並行使用共享成員變量int *x這樣爲什麼不允許在OpenMP中共享類成員變量x(x)?

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

但如果我嘗試

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

我得到的錯誤:'obj::x' is not a variable in clause 'shared'。 我更喜歡第二個版本,因爲它宣佈它正在使用的共享變量,提醒我確保沒有競爭條件或類似問題。

這是怎麼回事OpenMP聲稱obj::x不是一個變量?

+0

你試過這個 - > x?你也使用什麼編譯器? – Beanz 2011-01-06 16:26:05

+0

編譯器是g ++ 4.4。嘗試'#pragma omp parallel for default(none)shared(this-> x,size)'給出錯誤'error:expected'在'this'之前的非限定id'' – 2011-01-06 20:18:07

回答

11

OpenMP的大部分的實現勾勒出並行區域。也就是說,他們使它成爲一種功能。私有變量通常被傳遞給這個函數,並且共享變量可以被傳遞或者在函數的作用域內。類數據成員的問題是它們與變量不同。

當編譯器概述並行區域時,變量定義了存儲位置,編譯器可以設置該位置以傳遞給函數。在程序執行期間調用類之前,數據成員可能不會被實例化(即分配存儲空間)。這意味着編譯器本身不能私有化數據成員。它也必須在運行時完成,這將導致更多的工作,並會影響串行和並行程序的性能。到目前爲止還沒有實現嘗試做這項工作,並且由於OpenMP規範是通過一致性編寫的,因此決定禁止所有子句中的數據成員。否則,說共享條款允許它們,但沒有其他條款似乎太混亂了。

1

不precisiely知道 - 但看看通過32 OpenMP traps for C++ developers分揀出最OpenMP的問題

+1

感謝您的鏈接! – 2011-01-20 21:39:13

+0

我沒有在鏈接的文檔中找到對我的問題的任何參考。你可以說得更詳細點嗎? – 2011-01-21 12:40:08

+0

對不起,我沒有確切的答案,我希望鏈接中會有東西可以幫助你 – 2011-01-21 19:13:31