GPU Drano是用於GPU程序的靜態分析工具。 GPU Drano中的分析之一是在CUDA代碼中查找不透明的內存訪問。 GPU Drano支持的另一個分析是分析以證明GPU計劃的塊大小獨立性。
現代GPU捆綁線將線程變成扭曲。經紗中的所有線程都以鎖定操作執行操作。如果內存相鄰或足夠接近內存,則可以將內存訪問到不同的內存位置。當經紗訪問的內存距離很遠時,需要多個負載/存儲來完成內存事務,我們說訪問是不循環的。
據說GPU內核是獨立的,如果修改塊大小,同時保持螺紋總數相同,則不會破壞程序的功能。這對於在GPU程序中正確的塊大小調整至關重要,GPU程序通常用於提高程序性能。
我們還實施了動態分析來識別不含水的訪問,該訪問可在此存儲庫中可用。
GPU Drano使用Google的開源CUDA實現: gpucc實施了LLVM的編譯器通行證。因此,Drano與LLVM緊密結合。
Drano需要LLVM 6.0版或更高版本。它還需要NVIDIA的CUDA工具包(7.5版或更高版本)。它已在Ubuntu 16.04 LTS上進行了測試,但應與大多數現有的Linux系統一起使用。
靜態分析本身不需要GPU。但是,要執行程序並運行動態性Anlaysis,需要使用NVIDIA GPU和兼容的驅動程序。查看NVIDIA的系統要求以獲取更多信息。
算法的詳細信息和設計選擇可以在以下論文中找到:
項目詳細installnrun.sh了在Ubuntu系統上構建和執行GPU Drano所需的步驟。要運行腳本,
ROOT_DIR設置為下載文件夾的路徑。sh installnrun.sh這將自動在Linux系統上安裝GPU Drano。我們進一步描述了在此處安裝不透明訪問分析的安裝步驟。可以類似地完成用於塊大小獨立分析的安裝(也稱為塊大小不變性分析)。
獲取LLVM來源:
確保安裝subversion 。下載最新版本的LLVM:
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
獲取Clang Source:
將當前的工作目錄更改為llvm/tools/然後從SVN存儲庫中查看clang :
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
將GPU Drano添加到LLVM:
將GPU Drano的src/文件夾複製到您的源代碼中的目錄llvm/lib/Transforms/UncoalescedAnalysis :
cp -r src/abstract-execution/* llvm/lib/Transforms/UncoalescedAnalysis
cp -r src/uncoalesced-analysis/* llvm/lib/Transforms/UncoalescedAnalysis
這將創建一個稱為llvm/lib/Transforms/UncoalescedAnalysis/的文件夾。我們必須在LLVM構建系統cmake上註冊通行證。因此,將add_subdirectory(UncoalescedAnalysis)附加到llvm/lib/Transforms/CMakeLists.txt
示例cmakelists.txt文件:
$> more CMakeLists.txt
add_subdirectory(Utils)
add_subdirectory(Instrumentation)
add_subdirectory(InstCombine)
add_subdirectory(Scalar)
add_subdirectory(IPO)
add_subdirectory(Vectorize)
add_subdirectory(Hello)
add_subdirectory(ObjCARC)
add_subdirectory(Coroutines)
add_subdirectory(UncoalescedAnalysis)
構建LLVM和GPU Drano:
從Drano的根目錄中,創建一個build/目錄。然後,將目錄更改為build/目錄。確保將CMAKE安裝在系統上。在此處執行以下命令:
cmake ../llvm
make
這是cmake LLVM目錄( ../llvm )的路徑。 CMAKE為您的系統配置LLVM。它應該在您當前的工作目錄( build/ )中生成幾個文件。該命令make LLVM和Drano構建。
理想情況下,使用make -j N其中n是您需要並行構建的內核數,因為LLVM需要很長時間才能構建。
注意:LLVM構建需要大量內存來編譯,特別是在鏈接步驟中。如果您的RAM <8 GB,LLVM可能無法構建。如果是這樣,您可以在沒有-j選項的情況下重新make 。這只會重新編譯構建的失敗部分,並且節省的時間比從一開始就使用-j時間要多。
sudo make install INSTALL 。這應該在默認位置(或指定位置)中安裝庫和二進製文件。如果在本地安裝,則本指南假定Bash可以在其路徑中找到命令。
以上是快速入門指南。如果您不熟悉LLVM,則可以在以下位置找到安裝的所有詳細信息:http://llvm.org/docs/gettingstarted.html
腳本installnrun.sh簡要介紹了構建NVIDIA驅動程序,工具包和SDK的過程。該腳本已發表評論,以避免覆蓋現有NVIDIA驅動程序的風險。請注意,我們只需要工具包和SDK來運行靜態分析。我們還需要驅動程序和一個工作的GPU來執行動態分析和CUDA程序本身。
安裝NVIDIA驅動程序,CUDA工具包和SDK:請參閱NVIDIA安裝指南以獲取說明。
總而言之,如果您使用最近和流行的Linux發行版,則應該能夠使用自動下載工具來安裝所需的驅動程序和SDK。
如果您已經安裝了所需的驅動程序和SDK,則可以跳過此步驟。覆蓋現有驅動程序可能不是一個好主意,因為這可能使您的系統無法使用。
您可能需要G ++-Multilib來安裝clang要求的必要庫。
此步驟是可選的。現在應該使用clang或clang++編譯的簡單CUDA程序,例如“ Hello World”:
clang -x cuda helloWorld.cu
-x cuda選項明確指出該語言。您也可以省略它,Clang將其作為CUDA程序推斷。
注意:您的叮噹聲安裝可能無法找到幾個內部LLVM功能,如果是的,則可能需要包括-lcudart 。您可能還需要指向cudart.so的位置。
例子:
clang -x cuda -L /usr/local/cuda/targets/x86_64-linux/lib/ -lcudart helloWorld.cu
因此,您的cudart路徑可能會有所不同,具體取決於您的系統。
LLVM應該生成一個共享對象.so文件,稱為LLVMUncoalescedAnalysis.so ,在build/lib/ Directory下。
LLVM Crumplier clang在編譯CUDA程序時生成單獨的設備(GPU內核代碼)和主機(在CPU上運行的代碼)。 GPU Drano分析設備代碼的LLVM IR文件。
例如,讓我們分析為gaussian基準測試的Rodinia內核代碼。我們將目錄更改為rodinia_3.1/cuda/gaussian/ 。
首先,我們的clang生成了我們感興趣的代碼的LLVM IR文件:
clang++ -S -g -emit-llvm gaussian.cu
請注意,我們使用DEBUG SYMBER -g編譯,以保留有關生成IR中源代碼位置的調試信息。這用於指向LLVM IR的潛在不透明訪問的源代碼位置。
該彙編生成了兩個文件:
gaussian-cuda-nvptx64-nvidia-cuda-sm_20.ll
gaussian.ll
然後,我們可以通過指定GPU Drano二進制的opt並指定Pass -interproc-uncoalesced-analysis Analysis以運行靜態分析。該通行證是一種概論分析,可檢測不循環的訪問。它從對呼叫圖中最高功能的分析開始,然後按照拓撲順序進行對其callees的分析。在分析特定的Callee時,它考慮了所有呼叫者的呼叫上下文的聯接。為了運行術中分析(假設所有初始函數參數與線程ID無關),請指定Pass- -uncoalesced-analysis進行運行,而不是-interproc-uncoalesced-analysis 。
opt -load ../../../build/lib/LLVMUncoalescedAnalysis.so -instnamer -interproc-uncoalesced-analysis < gaussian-cuda-nvptx64-nvidia-cuda-sm_20.ll > /dev/null 2> gpuDranoResults.txt
請注意, opt從標準輸入中讀取紅外文件。 opt將其自己無趣的輸出寫入標準輸出,因此我們將其重定向到/dev/null gpu drano的輸出被寫入標準誤差,可以重定向到文件。
為了生成詳細分析結果(使用分析信息註釋的LLVM IR), opt使用其他額外的-debug-only=uncoalesced-analysis Flag運行。
以下命令可用於在程序上運行塊大小的獨立性分析。
opt -load ../../../build/lib/LLVMBlockSizeInvarianceAnalysis.so - -instnamer -always-inline -interproc-bsize-invariance-analysis < gaussian-cuda-nvptx64-nvidia-cuda-sm_20.ll > /dev/null 2> gpuDranoResults.txt
無淨訪問分析報告的生成結果報告了所有gpu內核中可能不含義的所有訪問。例如,以下是分析gaussian.cu的結果。
Analysis Results:
Function: _Z4Fan1PfS_ii
Uncoalesced accesses: #2
-- gaussian.cu:295:59
-- gaussian.cu:295:61
Analysis Results:
Function: _Z4Fan2PfS_S_iii
Uncoalesced accesses: #4
-- gaussian.cu:312:38
-- gaussian.cu:312:35
-- gaussian.cu:312:35
-- gaussian.cu:317:23
每個結果項目都指向源代碼中潛在的不透明訪問。例如,在第295行中訪問m_cuda ,在方法Fan1()中Gaussian.cu中的第59列是不透明的。
同樣,用於塊大小獨立性分析的生成的結果確定所有具有塊大小獨立的內核!
Rodinia是由GPU計劃的流行基準套件,該計劃由來自不同領域的22個程序組成。我們分析了該套件,並使用靜態分析發現了111個真正的不透明訪問。為了重現結果,以下是所涉及的步驟:
在rodinia_3.1/common/make.config中更新CUDA和DRANO配置。使用NVIDIA工具包和SDK路徑設置CUDA_DIR和SDK_DIR 。更新opt ALIAS和GPU DRANO二進制LLVMUncoalescedAnalysis.so 。
轉到Benchmarks目錄rodinia_3.1/cuda 。
編譯基準:
sh compile.sh
sh run-analysis.sh
每個基準分析都會在名為log_<filename>的日誌文件中生成其各自的文件夾。
./summarize-results.sh
NVIDIA提供了一組CUDA樣品,可用於各種應用。我們分析了套件以識別樣品中的塊大小獨立核。為了重現結果,這些步驟是:
更新NVIDIA_CUDA-8.0_Samples/common/drano.mk中的HOME變量到root gpu drano目錄。
安裝OpenGL(編譯一些基準測試所需的必需)。在Ubuntu上,可以使用以下命令:
sudo apt-get install freeglut3-dev
轉到目錄NVIDIA_CUDA-8.0_Samples
編譯基準:
sh compile.sh
sh run-analysis.sh
每個基準分析都會在名為log_<filename>的日誌文件中生成其各自的文件夾。
./summarize-bsize-independence.sh