是的,這些警告可能導致代碼順序運行(請參閱假設您使用PGI的-Minfo = accel的編譯器反饋輸出)。默認情況下,標量是第一個私有的。但是,如果標量的值在OpenACC計算區域之外使用,編譯器不能自動將標量私有化,因爲它不知道使用哪個值。
當標量的計算區域後使用,例如可能發生這種情況
#pragma acc parallel loop
for (int i=...
x = <expr>
...
}
printf("Final X=%d\n",x);
您可以解決此我把「×」專用條款內,但打印的「X」的值將在循環之前保持不變。
可能出現這種情況的另一種情況是在計算區域內更新全局標量時。在這種情況下,您希望將變量放在數據子句(例如「copy」)中以使變量由所有線程共享,然後在更新值時使用OpenACC「atomic」指令。
第三種情況是標量通過地址傳遞給設備子例程。在這種情況下,編譯器必須假定其他引用是標量。雖然很可能你不會爲全局指針指定一個全局指針,但這是可能的,並且由於編譯器不能看到子程序,它必須假定它。要解決此問題,請將標量添加到OpenACC「private」子句中,或更改代碼以按值傳遞標量。請注意,Fortran默認通過地址傳遞參數。要按值傳遞,請在參數的聲明中使用F2003「value」屬性。
如果您的方案與上面列出的不同,請提供說明問題的示例代碼。
在這裏,我不得不使用循環的並行執行的x代碼的後期部分中的最後更新的值。如果我去第一個場景,我不能使用x的最近value.If我使用第二個場景,原子做不要讓一個以上的迭代在同一時間向x寫入值。是否openmp中有任何數據子句,如openmp中的「lastprivate」,它保留了循環的並行執行性質,並讓我們使用變量的更新值? –
不,在OpenACC中沒有等價於「lastprivate」。我的理解是OpenACC委員會對此進行了討論,但沒有引人注目的用例。雖然標準是用戶驅動的,所以考慮加入OpenACC用戶列表並請求此功能。 http://list.openacc.org/mailman/listinfo/openacc-users_list.openacc.org –