2015-08-14 55 views
0

我正在使用pgi編譯器使用openacc。我想知道如何在運行時配置關於內存使用情況的代碼,特別是共享內存?OpenACC共享內存使用情況

非常感謝您的幫助!

Behzad

+0

你的意思是哪個共享內存? [OpenACC規範](http://www.openacc.org/sites/default/files/OpenACC.2.0a_1.pdf)主要使用「共享內存」來區分兩種類型的加速器:1.加速器,主機並且設備內存被共享稱爲「共享內存加速器」2.主機和設備內存分離的加速器 - 「非共享內存加速器」?或者,您的意思是「共享內存,因爲它是由CUDA定義的?或者您的意思是OpenCL 2.0共享虛擬內存?」 –

+0

感謝您的迴應,我的意思是CUDA意義上的共享內存,即緩存在OpenACC(!緩存) –

回答

1

我假設你的意思是在CUDA意義上的「共享內存」(在NVIDIA GPU快,每個SM共享內存)。在這種情況下,你有幾個選擇。首先,如果您只想知道正在使用多少共享內存,則可以在編譯時通過添加-Mcuda=ptxinfo來確定。

pgcc -fast -ta=tesla:cc35 laplace2d.c -Mcuda=ptxinfo 
ptxas info : 0 bytes gmem 
ptxas info : Compiling entry function 'main_61_gpu' for 'sm_35' 
ptxas info : Function properties for main_61_gpu 
    0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 
ptxas info : Used 26 registers, 368 bytes cmem[0] 
ptxas info : Compiling entry function 'main_65_gpu_red' for 'sm_35' 
ptxas info : Function properties for main_65_gpu_red 
    0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 
ptxas info : Used 18 registers, 368 bytes cmem[0] 
ptxas info : Compiling entry function 'main_72_gpu' for 'sm_35' 
ptxas info : Function properties for main_72_gpu 
    0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 
ptxas info : Used 18 registers, 344 bytes cmem[0] 

在上述情況下,它似乎沒有使用任何共享內存。 (後續我與PGI編譯器的工程師講,得知共享內存是在內核啓動動態調整,所以不會通過ptxinfo露面。)

您還可以使用NVIDIA視覺分析器來獲得在此信息。如果您收集GPU時間線,然後單擊特定內核的實例,則屬性面板應該打開並顯示共享內存/塊。在我的情況下,上面顯示使用了0字節的共享內存,Visual Profiler顯示了一些內存被使用,所以我需要深入瞭解原因。

你也可以在運行時獲得一些信息。如果你舒服就命令行,你可以使用nvprof:

# Analyze load/store transactions 
$ nvprof -m shared_load_transactions,shared_store_transactions ./a.out 
# Analyze shared memory efficiency 
# This will result in a LOT of kernel replays. 
$ nvprof -m shared_efficiency ./a.out 

這並不表明使用量,但給你如何使用它的想法。 Visual Profiler的指導分析將讓您對這些指標的含義有所瞭解。

+0

非常感謝Jeff提供的詳細信息,我檢查了代碼並沒有共享內存(緩存)的使用情況,但是當我在內部循環中添加!$ acc緩存作爲其中一個向量時,性能退化計算時間增加,GFLOP減少)我知道如何在CUDA中實現共享內存,但我不知道如何在OpenACC中有效實現它 –

+0

有時我見過的一件事是,如果我使用'kernels'指令編譯器有時會自動爲代碼添加緩存(你可以在'-Minfo'消息中看到它),但是如果你使用'parallel loop',你通常必須明確地使用'cache'指令。如果你有數組這是私人w在''gang'循環中,你更有可能獲得數組緩存(並且更有可能獲得'cache'指令的工作)。 – jefflarkin

+0

如果您在編寫OpenACC時考慮到CUDA內核,特別是當您想要實現這些較低級別的優化時,可能會非常沮喪。看到我以前的評論關於讓'cache'工作的技巧。有時用OpenACC進行優化可能有點手動波動,有很多猜測和手指交叉。我們正在努力改善。 – jefflarkin