在CUDA中使用volatile限定符聲明寄存器數組有什麼意義?何時使用volatile與寄存器/局部變量
當我用volatile關鍵字與寄存器數組一起嘗試時,它將溢出的寄存器內存數刪除到本地內存。 (即強制CUDA使用寄存器而不是本地存儲器)這是預期的行爲嗎?
我在CUDA文檔中沒有找到關於volatile寄存器陣列的使用信息。
這裏是ptxas -v輸出兩種版本
揮發性預選賽
__volatile__ float array[32];
ptxas -v輸出
ptxas info : Compiling entry function '_Z2swPcS_PfiiiiS0_' for 'sm_20'
ptxas info : Function properties for _Z2swPcS_PfiiiiS0_
88 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 47 registers, 16640 bytes smem, 80 bytes cmem[0], 8 bytes cmem[16]
不揮發性預選賽
個float array[32];
ptxas -v輸出
ptxas info : Compiling entry function '_Z2swPcS_PfiiiiS0_' for 'sm_20'
ptxas info : Function properties for _Z2swPcS_PfiiiiS0_
96 bytes stack frame, 100 bytes spill stores, 108 bytes spill loads
ptxas info : Used 51 registers, 16640 bytes smem, 80 bytes cmem[0], 8 bytes cmem[16]
'volatile'限定符指定編譯器所有對變量的引用(讀或寫)應該導致內存引用,並且這些引用必須按程序中指定的順序。 Shane Cook的書籍「CUDA編程」第12章介紹了使用'volatile'限定符。我的理解是,這種使用將避免編譯器可以做的一些優化,因此改變使用的寄存器的數量。我認爲理解它實際做什麼的最好方法是反彙編帶有和不帶限定詞的相關'__global__'函數。 – JackOLantern