在反汇编的CUDA微代码中显然存在冗余操作

活力

我有以下内核,将全局内存矩阵简单地分配in给全局内存矩阵out

__global__ void simple_copy(float *outdata, const float *indata){

    int x = blockIdx.x * TILE_DIM + threadIdx.x;
    int y = blockIdx.y * TILE_DIM + threadIdx.y;

    int width = gridDim.x * TILE_DIM;

    outdata[y*width + x] = indata[y*width + x];

}

我正在检查由倾销的反汇编微代码cuobjdump

Function : _Z11simple_copyPfPKf
/*0000*/     /*0x00005de428004404*/     MOV R1, c [0x1] [0x100]; 
/*0008*/     /*0x80001de218000000*/     MOV32I R0, 0x20;            R0 = TILE_DIM
/*0010*/     /*0x00001c8614000000*/     LDC R0, c [0x0] [R0];       R0 = c
/*0018*/     /*0x90009de218000000*/     MOV32I R2, 0x24;            R2 = 36
/*0020*/     /*0x00209c8614000000*/     LDC R2, c [0x0] [R2];       R2 = c

int x = blockIdx.x * TILE_DIM + threadIdx.x;
/*0028*/     /*0x9400dc042c000000*/     S2R R3, SR_CTAid_X;         R3 = BlockIdx.x
/*0030*/     /*0x0c00dde428000000*/     MOV R3, R3;                 R3 = R3 ???
/*0038*/     /*0x84011c042c000000*/     S2R R4, SR_Tid_X;           R3 = ThreadIdx.x
/*0040*/     /*0x10011de428000000*/     MOV R4, R4;                 R4 = R4 ???
/*0048*/     /*0x8030dca32008c000*/     IMAD R3, R3, 0x20, R4;      R3 = R3 * TILE_DIM + R4  (contains x)

int y = blockIdx.y * TILE_DIM + threadIdx.y;
/*0050*/     /*0x98011c042c000000*/     S2R R4, SR_CTAid_Y;
/*0058*/     /*0x10011de428000000*/     MOV R4, R4;
/*0060*/     /*0x88015c042c000000*/     S2R R5, SR_Tid_Y;
/*0068*/     /*0x14015de428000000*/     MOV R5, R5;
/*0070*/     /*0x80411ca3200ac000*/     IMAD R4, R4, 0x20, R5;      R4 ...                   (contains y)

int width = gridDim.x * TILE_DIM;
/*0078*/     /*0x50015de428004000*/     MOV R5, c [0x0] [0x14];     R5 = c
/*0080*/     /*0x80515ca35000c000*/     IMUL R5, R5, 0x20;          R5 = R5 * TILE_DIM       (contains width)   

y*width + x
/*0088*/     /*0x14419ca320060000*/     IMAD R6, R4, R5, R3;        R6 = R4 * R5 + R3        (contains y*width+x)

Loads indata[y*width + x]
/*0090*/     /*0x08619c036000c000*/     SHL R6, R6, 0x2;            
/*0098*/     /*0x18209c0348000000*/     IADD R2, R2, R6;            
/*00a0*/     /*0x08009de428000000*/     MOV R2, R2;                 R2 = R2 ???
/*00a8*/     /*0x00209c8580000000*/     LD R2, [R2];                Load from memory - R2 = 

Stores outdata[y*width + x]
/*00b0*/     /*0x1440dca320060000*/     IMAD R3, R4, R5, R3;        
/*00b8*/     /*0x0830dc036000c000*/     SHL R3, R3, 0x2;
/*00c0*/     /*0x0c001c0348000000*/     IADD R0, R0, R3;            R0 = R0 + R3
/*00c8*/     /*0x00001de428000000*/     MOV R0, R0;                 R0 = R0 ???
/*00d0*/     /*0x00009c8590000000*/     ST [R0], R2;                Store to memory

/*00d8*/     /*0x40001de740000000*/     BRA 0xf0;
/*00e0*/     /*0x00001de780000000*/     EXIT;
/*00e8*/     /*0x00001de780000000*/     EXIT;
/*00f0*/     /*0x00001de780000000*/     EXIT;
/*00f8*/     /*0x00001de780000000*/     EXIT;

在反汇编代码的顶部或旁边的注释是我自己的。

如您所见,在注释中标记了一些显然无用的操作???从本质上讲,它们是寄存器的移动。

然后,我有以下两个问题:

  1. 如果它们没有用,我相信它们无用地消耗了计算时间。我可以通过删除它们来优化反汇编的微代码吗?
  2. PTX文件可以用CUDA代码内联。但是,PTX只是跨GPU可移植性所需的中间语言。我可以以某种方式“内联”优化的反汇编微代码吗?

提前非常感谢您。

编辑:SM = 2.0的发布模式下已编译的相同代码

Function : _Z11simple_copyPfPKf
.headerflags    @"EF_CUDA_SM20 EF_CUDA_PTX_SM(EF_CUDA_SM20)"
/*0000*/        MOV R1, c[0x1][0x100];            /* 0x2800440400005de4 */
/*0008*/        S2R R0, SR_CTAID.Y;               /* 0x2c00000098001c04 */
/*0010*/        S2R R2, SR_TID.Y;                 /* 0x2c00000088009c04 */
/*0018*/        S2R R3, SR_CTAID.X;               /* 0x2c0000009400dc04 */
/*0020*/        S2R R4, SR_TID.X;                 /* 0x2c00000084011c04 */
/*0028*/        MOV R5, c[0x0][0x14];             /* 0x2800400050015de4 */
/*0030*/        ISCADD R2, R0, R2, 0x5;           /* 0x4000000008009ca3 */
/*0038*/        ISCADD R3, R3, R4, 0x5;           /* 0x400000001030dca3 */
/*0040*/        SHL R0, R5, 0x5;                  /* 0x6000c00014501c03 */
/*0048*/        IMAD R2, R0, R2, R3;              /* 0x2006000008009ca3 */
/*0050*/        ISCADD R0, R2, c[0x0][0x24], 0x2; /* 0x4000400090201c43 */
/*0058*/        ISCADD R2, R2, c[0x0][0x20], 0x2; /* 0x4000400080209c43 */
/*0060*/        LD R0, [R0];                      /* 0x8000000000001c85 */
/*0068*/        ST [R2], R0;                      /* 0x9000000000201c85 */
/*0070*/        EXIT ;                            /* 0x8000000000001de7 */

编辑:SM = 2.1的发布模式下已编译的相同代码

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 */
看守人

这两个问题的答案是否定的。

如果您尝试从最终的二进制有效负载中删除指令。您将更改代码段的长度,并破坏ELF和Fatbinary文件。要解决此问题,需要手工制作格式不容易记录的标头,这听起来像是要做很多工作,只是为了优化一些指令。

并且不支持内联本机汇编程序,但我确定您已经知道。

最后,我无法使用CUDA 5.0复制:

Fatbin elf code:
================
arch = sm_20
code version = [1,6]
producer = cuda
host = mac
compile_size = 32bit
identifier = pumpkinhead.cu

    code for sm_20
        Function : _Z11simple_copyPfPKf
    /*0000*/     /*0x00005de428004404*/     MOV R1, c [0x1] [0x100];
    /*0008*/     /*0x98001c042c000000*/     S2R R0, SR_CTAid_Y;
    /*0010*/     /*0x88009c042c000000*/     S2R R2, SR_Tid_Y;
    /*0018*/     /*0x9400dc042c000000*/     S2R R3, SR_CTAid_X;
    /*0020*/     /*0x84011c042c000000*/     S2R R4, SR_Tid_X;
    /*0028*/     /*0x08001ca340000000*/     ISCADD R0, R0, R2, 0x5;
    /*0030*/     /*0x10309ca340000000*/     ISCADD R2, R3, R4, 0x5;
    /*0038*/     /*0x50001ca350004000*/     IMUL R0, R0, c [0x0] [0x14];
    /*0040*/     /*0x08009ca340000000*/     ISCADD R2, R0, R2, 0x5;
    /*0048*/     /*0x90201c4340004000*/     ISCADD R0, R2, c [0x0] [0x24], 0x2;
    /*0050*/     /*0x80209c4340004000*/     ISCADD R2, R2, c [0x0] [0x20], 0x2;
    /*0058*/     /*0x00001c8580000000*/     LD R0, [R0];
    /*0060*/     /*0x00201c8590000000*/     ST [R2], R0;
    /*0068*/     /*0x00001de780000000*/     EXIT;
        .....................................

您确定显示的代码是使用发布设置编译的吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何反汇编 .NET 代码?

来自分类Dev

运行汇编程序和运行 shellcode.c 中的反汇编代码的区别

来自分类Dev

C ++ CodeBlocks反汇编;方式太多的代码?

来自分类Dev

如何使Eclipse以Intel语法反汇编代码

来自分类Dev

PHP代码中是否存在冗余条件?

来自分类Dev

C语言全局数组在其反汇编代码中的位置在哪里

来自分类Dev

在ARMv8中为objdump反汇编程序定义代码偏移量

来自分类Dev

反汇编代码中的ebp和esp是什么意思?

来自分类Dev

CDT eclipse源代码,反汇编视图源代码?

来自分类Dev

CDT eclipse源代码,反汇编视图源代码?

来自分类Dev

这种反汇编如何与给定的C代码相对应?

来自分类Dev

研究简单的代码反汇编输出和内存映射

来自分类Dev

匹配英特尔代码以反汇编输出

来自分类Dev

如何使用Javap反汇编所有代码?

来自分类Dev

IDA 反汇编为 Visual Studio 2017 中编译的 exe 生成与 ASM 文件完全不同的代码

来自分类Dev

分析gdb反汇编

来自分类Dev

GDB无法正确反汇编在RAM中运行的程序

来自分类Dev

在GDB中反汇编C函数。澄清GAS组装说明

来自分类Dev

XCode中组装和反汇编之间的区别

来自分类Dev

反汇编gdb中的地址到底是什么?

来自分类Dev

在反汇编Visual C ++中我的函数及其参数的名称

来自分类Dev

GDB无法正确反汇编在RAM中运行的程序

来自分类Dev

从通过dbgeng的DisassembleWide()反汇编的指令中删除地址

来自分类Dev

反汇编器输出中的功能偏移

来自分类Dev

如何获得CUDA内核的汇编代码?

来自分类Dev

删除方法中的冗余代码

来自分类Dev

如何查找通过操作码或反汇编使用的指令形式?

来自分类Dev

PowerPC反汇编程序输出与操作码不同

来自分类Dev

如何配置Qt创建器以显示C ++代码而不是反汇编程序?

Related 相关文章

  1. 1

    如何反汇编 .NET 代码?

  2. 2

    运行汇编程序和运行 shellcode.c 中的反汇编代码的区别

  3. 3

    C ++ CodeBlocks反汇编;方式太多的代码?

  4. 4

    如何使Eclipse以Intel语法反汇编代码

  5. 5

    PHP代码中是否存在冗余条件?

  6. 6

    C语言全局数组在其反汇编代码中的位置在哪里

  7. 7

    在ARMv8中为objdump反汇编程序定义代码偏移量

  8. 8

    反汇编代码中的ebp和esp是什么意思?

  9. 9

    CDT eclipse源代码,反汇编视图源代码?

  10. 10

    CDT eclipse源代码,反汇编视图源代码?

  11. 11

    这种反汇编如何与给定的C代码相对应?

  12. 12

    研究简单的代码反汇编输出和内存映射

  13. 13

    匹配英特尔代码以反汇编输出

  14. 14

    如何使用Javap反汇编所有代码?

  15. 15

    IDA 反汇编为 Visual Studio 2017 中编译的 exe 生成与 ASM 文件完全不同的代码

  16. 16

    分析gdb反汇编

  17. 17

    GDB无法正确反汇编在RAM中运行的程序

  18. 18

    在GDB中反汇编C函数。澄清GAS组装说明

  19. 19

    XCode中组装和反汇编之间的区别

  20. 20

    反汇编gdb中的地址到底是什么?

  21. 21

    在反汇编Visual C ++中我的函数及其参数的名称

  22. 22

    GDB无法正确反汇编在RAM中运行的程序

  23. 23

    从通过dbgeng的DisassembleWide()反汇编的指令中删除地址

  24. 24

    反汇编器输出中的功能偏移

  25. 25

    如何获得CUDA内核的汇编代码?

  26. 26

    删除方法中的冗余代码

  27. 27

    如何查找通过操作码或反汇编使用的指令形式?

  28. 28

    PowerPC反汇编程序输出与操作码不同

  29. 29

    如何配置Qt创建器以显示C ++代码而不是反汇编程序?

热门标签

归档