由nvcc编译器为CUDA程序生成的中间代码

时间:2013-10-24 19:00:59

标签: compiler-construction cuda nvcc

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

1 个答案:

答案 0 :(得分:4)

生成CUDA PTX文件 - Visual Studio说明

如果您需要从Visual Studio CUDA项目生成PTX文件,您可以采取以下措施:

  1. 访问项目的属性面板。
  2. 打开CUDA C / C ++配置程序。
  3. 将“保留预处理文件”设置为“是”。
  4. 在“保留目录”中设置目的地目录。
  5. 获取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是包含fat二进制文件的文件,它可能包含一个或多个特定于设备的二进制映像(在这种情况下,特定于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 */
    .....................................