在调试器里看GPU的长指令

    指令是处理器的语言,这个语言的格式决定了它和外界如何沟通,CPU如此,GPU也如此。

    X86的指令是不等长的,1个字节的指令很多,很多个字节的也不少。早期版本的ARM处理器指令都是4个字节,为此曾被当年的手机巨头诺基亚批评占内存太多,聪明的ARM工程师加班加点,短时间内搞出了一套“指令减肥”方案,可以把很多常用指令编码为2个字节,此举帮助ARM赢得了大单,这个技术称为Thumb指令集,使用至今。

    与CPU在1、2个字节上精打细算相比,GPU的指令阔绰多了。以NVIDIA、AMD、INTEL的三家GPU为例,AMD的指令有8个字节和四个字节两种,Nvidia的指令都是8个字节。

    先看一下NV的指令,所有指令都一样长的8个字节,每条指令的起始地址都可以被8整除,有图为证。

640?wx_fmt=png

    反汇编窗口中,有两种指令,一种是名为PTX的中间指令,另一种是名为SASS的硬件指令。从指令的内存地址可以看到每条指令都是8个字节,包括空操作nop。

    AMD和INTEL的GPU都属于VLIW,即Very long instruction word(非常长的指令字)。

    那么到底有多长呢?在INTEL的GEN GPU中,正常情况下,所有指令都是16个字节,四个DWORD。

    在四个DWORD中,一个用来放操作码和各种控制,一个是目标操作数,另两个可以用作源操作数。

    还是看图吧!

0

    各位请睁大眼睛看反汇编窗口,里面就是难得一见的GEN GPU指令,第一列是地址,然后是16字节的机器码,最后是指令的助记符,是不每一样都很长啊。

    因为每一条指令都是16字节,所以每条指令的地址也都是16字节对齐的。

    顺便说一下,图中左下角的子窗口中是寄存器,有GRF,还有ARF,GRF有128个,每一个都有256位,可以放32个BYTE,16个WORD,8个DWORD或者float,富裕吧。

    在16字节的长指令中,第一个DWORD里专门有一位,bit 30,是用来调试的,可以用来设置断点。看过《软件调试》的都知道,x86 CPU上设置软件断点需要把原来指令的一个字节保存起来,然后写个int 3进去,不用了再恢复原来的内容,换来换去真麻烦,所以GPU上,不费那个事了,专门拿出一个比特,置一下位就可以了。

    看到此,可能有的同行也想自己开调试器看看。那么如果你有NV硬件的话,NV的软件最稳定和成熟,是最容易的。对于INTEL的GPU,虽然号称每个CPU里都有GEN GPU,可是软件不争气,调试器支持的最低版本是酷睿6代的CPU。即便你的CPU足够新,但是安装环境和能让GPU断点工作也需要耐心。曾有一位同行说过,“搞了几年也没把它断下来”。AMD的软件也比较一般,反汇编窗口和寄存器窗口都不太稳定,时不时还可能把VS崩掉或者挂死。总之,GPU调试的坑还很多,以后会陆续在高端调试网站(advdbg.org)上以调试笔记的形式和大家交流。


***********************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生。

欢迎关注格友公众号

640?wx_fmt=jpeg


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值