2011-10-08 240 views
11

我使用CUDA 4.0 arch。和Compute_Capability 2.0設備(GTX460)。 'cubin'和'ptx'文件有什麼區別? 我認爲cubin是gpu的本地代碼,所以這是拱門。具體而言,ptx是通過JIT編譯在Fermi設備(例如Geforce GTX 460)上運行的中間語言。當我編譯cu源碼時,我可以在ptx或cubin目標之間進行選擇。如果我需要cubin文件,我選擇「code = sm_20」。但是如果我想要一個ptx文件,我使用「code = compute_20」。 這是正確的嗎?NVIDIA NVCC和CUDA:Cubin與PTX

+2

'.cubin'是CUDA二進制文件,'.ptx'是CUDA彙編源代碼(文本),它被傳遞給'ptxas'彙編器 –

回答

17

您已混淆了選項以選擇編譯階段(-ptx-cubin),並帶有控制要將哪些設備定位到的選項(-code),因此您應該重新訪問該文檔。

NVCC是NVIDIA編譯器驅動程序。 -ptx-cubin選項用於選擇編譯的特定階段,默認情況下,沒有任何階段特定選項,nvcc將嘗試從輸入生成可執行文件。大多數人使用-c選項來導致nvcc生成一個目標文件,稍後通過默認平臺鏈接器將其鏈接到一個可執行文件中,如果您使用的是驅動程序API,那麼-ptx-cubin選項才真正有用。有關中間階段的更多信息,請查看安裝CUDA Toolkit時安裝的nvcc手冊。

  • -ptx的輸出是純文本PTX文件。 PTX是NVIDIA GPU的中間彙編語言,尚未完全優化,稍後將彙編爲設備特定的代碼(例如,不同的設備具有不同的寄存器數量,因此完全優化PTX將是錯誤的)。
  • -cubin的輸出是一個胖二進制文件,它可能包含一個或多個特定於設備的二進制圖像以及(可選)PTX。

您引用的參數-code完全有不同的目的。我鼓勵你查看包含幾個例子的nvcc文檔,通常我會建議使用-gencode選項,因爲它允許更多的控制,並允許你在一個二進制文件中定位多個設備。作爲一個簡單的例子:

  • -gencode arch=compute_xx,code=\'compute_xx,sm_yy,sm_zz\'原因NVCC到目標計算能力XX的所有設備(這是arch=位)和嵌入PTX(code=compute_xx)以及設備特定的二進制用於sm_yy和sm_zz成最終脂肪二進制。