2013-10-24 120 views
-1

我正在與CUDA GPU並行編程。我用nvcc編譯器編譯了一個CUDA版本的矩陣乘法程序。現在我需要查看過程的中間代碼,以便了解並行化過程。我怎樣才能訪問這個?由nvcc編譯器爲CUDA程序生成的中間代碼

+0

看一看[生成在Visual Studio CUDA PTX文件(http://www.orangeowlsolutions.com/archives/464)線程執行(PTX)語言和[獲取CUDA程序集](http://www.orangeowlsolutions.com/archives/555)用於CUDA程序集,如果您想生成較低級別的代碼並更好地瞭解您的GPU實際上在做什麼。 – JackOLantern

+0

@RobertCrovella謝謝,羅伯特。我已將我的評論延伸至答案。 – JackOLantern

回答

3

生成CUDA PTX文件 - Visual Studio中的指令

如果您需要從您的Visual Studio的CUDA項目生成PTX文件,你可以按照如下作用:

  1. 訪問的屬性面板中你項目。
  2. 打開CUDA C/C++配置程序。
  3. 將「保留預處理文件」設置爲yes。
  4. 在「Keep Directory」中設置目的地的目錄。

獲取CUDA總成 - 的Visual Studio指令

PTX是設計爲在多個GPU架構便攜式的中間語言,但它不是由GPU所執行的最終的機器代碼。實際上,它被編譯器組件PTXAS編譯爲最終的機器代碼,也被稱爲SASS,用於特定的架構。 GPU實際執行的最終機器代碼可以通過使用cuobjdump實用程序進行反彙編獲得。 要做到這一點,在Visual Studio中Cuda的項目去:

Project -> Properties -> Configuration Properties -> CUDA C/C++ -> Common -> Keep Preprocessed Files -> choose Yes (--keep) 

打開命令窗口,進入到你的VS項目的發佈文件夾:

\..\Project_Name\Project_Name\Release 

和類型:

cuobjdump yourkernel.sm_21.cubin --dump -sass 

yourkernel.sm_21.cubin是包含一個胖二進制文件的文件,它可能包含一個或多個特定於設備的二進制圖像(在本例中,特定於sm_21)爲w (可選)PTX。

在命令窗口中,你將獲得並行類似

Function : _Z11simple_copyPfPKf 

.headerflags @"EF_CUDA_SM20 EF_CUDA_PTX_SM(EF_CUDA_SM20)" 

/*0000*/  MOV R1, c[0x1][0x100];     /* 0x2800440400005de4 */ 
/*0008*/  NOP;         /* 0x4000000000001de4 */ 
/*0010*/  MOV R0, c[0x0][0x14];     /* 0x2800400050001de4 */ 
/*0018*/  S2R R2, SR_CTAID.Y;     /* 0x2c00000098009c04 */ 
/*0020*/  SHL R0, R0, 0x5;      /* 0x6000c00014001c03 */ 
/*0028*/  S2R R3, SR_TID.Y;      /* 0x2c0000008800dc04 */ 
/*0030*/  ISCADD R3, R2, R3, 0x5;    /* 0x400000000c20dca3 */ 
/*0038*/  S2R R4, SR_CTAID.X;     /* 0x2c00000094011c04 */ 
/*0040*/  S2R R5, SR_TID.X;      /* 0x2c00000084015c04 */ 
/*0048*/  ISCADD R2, R4, R5, 0x5;    /* 0x4000000014409ca3 */ 
/*0050*/  IMAD R2, R0, R3, R2;     /* 0x200400000c009ca3 */ 
/*0058*/  ISCADD R0, R2, c[0x0][0x24], 0x2;  /* 0x4000400090201c43 */ 
/*0060*/  ISCADD R2, R2, c[0x0][0x20], 0x2;  /* 0x4000400080209c43 */ 
/*0068*/  LD R0, [R0];       /* 0x8000000000001c85 */ 
/*0070*/  ST [R2], R0;       /* 0x9000000000201c85 */ 
/*0078*/  EXIT ;         /* 0x8000000000001de7 */ 
.....................................