2017-03-01 68 views
0

雖然編譯OpenACC的代碼,我得到以下警告 215,標量爲環線後需要X最後一個值239 在線路迴路y的後需要標上一個值239 標標最後一個值在240行的循環後需要的最後一個值 第240行的y循環後需要的標量最後一個值 242行的循環後所需的標量最後一個值 第242行的y循環後所需的標量最後一個值 標量最後一個值在循環後需要在線246,248 標量在循環後需要的最後一個值在線248,252如何解決需要OpenACC的

這樣的警告是否使程序依次運行如何在OpenACC中使用lastvalue子句?

回答

1

是的,這些警告可能導致代碼順序運行(請參閱假設您使用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」屬性。

如果您的方案與上面列出的不同,請提供說明問題的示例代碼。

+0

在這裏,我不得不使用循環的並行執行的x代碼的後期部分中的最後更新的值。如果我去第一個場景,我不能使用x的最近value.If我使用第二個場景,原子做不要讓一個以上的迭代在同一時間向x寫入值。是否openmp中有任何數據子句,如openmp中的「lastprivate」,它保留了循環的並行執行性質,並讓我們使用變量的更新值? –

+0

不,在OpenACC中沒有等價於「lastprivate」。我的理解是OpenACC委員會對此進行了討論,但沒有引人注目的用例。雖然標準是用戶驅動的,所以考慮加入OpenACC用戶列表並請求此功能。 http://list.openacc.org/mailman/listinfo/openacc-users_list.openacc.org –