我編寫了一個包含多個子例程的CUDA程序。當我禁用子例程A時,運行時改進了數量a。當我禁用子程序B時,運行時間改進量b。當我禁用子程序A和B時,運行時間改善量爲c> a + b。兩個子程序都是完全獨立的。二進制代碼長度對CUDA程序性能的影響
這接下來的部分可能是分析這是一個幼稚的做法,但這裏是我做過什麼:我編譯的代碼的每個版本和跑了每個二進制cuobjdump自卸薩斯。對於完整的二進制文件,結果輸出約爲1350行,對於每個二進制文件,其中一個子程序被禁用約1100行。如果我禁用了這兩個子程序,我得到了850行。看起來,我需要3.1美元每行的前三個和2.4美國的兩個子程序被禁用。
由於A和B不包含任何複雜的內容或比其他代碼更加深入地使用內存,我不認爲這是由於註釋掉所有的時間密集型操作而導致簡單的活動而引起的。我的猜測是禁用A和B的程序代碼仍然適合流式多處理器的指令緩存,而其他版本的指令緩存太大。這可能會導致全局內存訪問,以便可以加載更多程序代碼,並且延遲會導致此差異。不幸的是我找不到指令緩存大小的任何信息。
任何人都可以幫我解釋這些結果嗎?
進行此類分析時,您需要非常小心。 GPU編譯器和彙編器具有非常積極的「死代碼刪除」優化。如果編譯器可以確定代碼段不會影響寫入全局內存的結果,那麼它只會從內核中刪除整段代碼。 – talonmies
是的,但是當我運行cuobjdump --dump-sass?我想知道運行時間的下降,以及這可能與二進制代碼的長度有關。 – volker
當前版本的CUDA分析器不顯示指令高速緩存統計信息。 Nsight Visual Studio版CUDA Profiler確實顯示停滯原因。如果主要的失速原因是Fetch,那麼內核可能會破壞icache,或者你有很多跳轉。進一步的解釋將需要分析報告和審查代碼。 –