2017-10-20 89 views
0

電話PGI運行時不支持的功能 - !pgf90_copy_f77_argl_i8錯誤編譯OpenACC的例程「pgf90_copy_f77_argl_i8」

我相信我傳遞一個8字節的整數參數澳元ACC程序。

任何解決方法或在此更新?

PGI編譯器17.4

示例。

type some 
integer(4),pointer :: xx(:) 
integer(4),pointer :: yy(:) 
end type 

type(some), pointer :: data(:) 
call func(data(3) % xx, data(5) % yy) 

這裏func是acc例程,所以我想這種方法是創建一個問題。

我們將創建臨時數組,然後傳遞它們。

回答

0

此例程檢查使用F77調用約定時傳遞的數組是否是連續的。如果它不是連續的,則運行時必須創建一個臨時數組,以便連續傳遞數組切片。

雖然你說你正在傳遞一個8字節的整數,你還傳遞一個數組切片?

我們(PGI)在這裏確實存在難題。 「解決方案」是爲了讓我們創建模擬我們在主機上的行爲的設備端運行時例程。 但是,這意味着編譯器可能需要在設備上爲每個線程分配一個臨時數組,將切片數據複製到臨時數組,傳入臨時數組,然後將結果複製回主數組。但是,這絕對會殺死你的循環的性能,所以不是我們真正想做的事情。

這是我們在內部辯論的東西。我們希望用戶能夠更輕鬆地移植他們的代碼,但知道我們是否添加了這種支持,這會損害性能,並且不會明顯地爲什麼。所以現在,我們鼓勵用戶避免傳遞數組切片,而是傳遞基數組併爲索引添加額外的參數。

無可否認,我們需要先處理錯誤消息,以便更清楚地瞭解問題。我推動了我們的編譯團隊,但這不是直截了當的。同時,如果您看到任何這些「argl」運行時調用,這就是發生了什麼事情。

+0

Thanks mat, 我在問題中添加了一些示例代碼。可能會讓事情變得更加清晰。 看起來目前的解決方案是創建臨時數組並在全局範圍內傳遞它們,然後再調用acc kerenels –

+0

好的,所以這裏的問題是您要傳遞一個指針。由於指針可能不是連續的,這就是爲什麼需要添加這個運行時檢查。您可以嘗試將F2008「連續」屬性添加到指針的聲明中,以便編譯器知道它不需要此檢查。 –