2013-10-24 95 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 */ 
.....................................