-1

我正在使用 CUDA GPU 进行并行编程。我用 nvcc 编译器编译了一个 CUDA 版本的矩阵乘法程序。现在需要看一下流程的中间代码,这样才能理解并行化的流程。我怎样才能访问这个?

4

1 回答 1

4

生成 CUDA PTX 文件 - Visual Studio 说明

如果您需要从您的 Visual Studio CUDA 项目生成 PTX 文件,您可以执行以下操作:

  1. 访问项目的属性面板。
  2. 打开 CUDA C/C++ 配置器。
  3. 将“保留预处理文件”设置为是。
  4. 在“保留目录”中设置目标目录。

获取 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 项目的 Release 文件夹:

\..\Project_Name\Project_Name\Release 

并输入:

cuobjdump yourkernel.sm_21.cubin --dump -sass

yourkernel.sm_21.cubin是包含一个胖二进制文件的文件,它可能包含一个或多个特定于设备的二进制图像(在这种情况下,特定于sm_21)以及(可选)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 */
.....................................
于 2013-10-25T16:25:00.290 回答