百科问答小站 logo
百科问答小站 font logo



SIMD指令和SIMT指令有什么区别? 第1页

  

user avatar   ruc-whc 网友的相关建议: 
      

看了楼上,只有一个类比搬砖的回答说的还行,我来说个更直接更详细的吧。

在这二者出现之前,占主导的都是SISD(Single instructrue single data),但很快人们发现不少场景的特点是逻辑简单,计算量大,而且从算法的角度这些计算还能并行做。那么最直接的想法是多搞几块芯片并行算呗,就是多核系统,对应到编程层面就是多线程编程的模型。

这么个产物呢,编程编起来是还挺爽的,稍微解决一下多线程互斥,同步之类的小问题就好了。但很快就有人想起来,不对啊,这么做从硬件的角度看很不划算啊,我只是为了能并行地计算,按理说只要多搞几套计算元件和寄存器就好了,现在连指令元件,比如取指,比如译码,比如发射,都给我搞了好几套,这不是浪费吗?所以很快又有机智的人解决了这个问题,让一套指令部件能够带动很多套元算部件,这套硬体现在指令集层面就是,单条指令的操作数,从原来的几个,变成了可以一大堆。这就是SIMD。

但是SIMD很快人们就发现了两个痛点。第一,高级语言不好支持,基本上都是靠直接在C语言里嵌汇编来用,这就很痛苦,整得明白的人也不多。第二,用起来很不灵活,比如有时候我一部分位置要做计算,一部分位置不用做计算,这就很难整。人们开始怀念起了多线程编程的轻松快乐。

再然后就到了一家有野心的公司叫英伟达。从硬件层面,GPU本质上跟前面提到的SIMD一样,少量的指令部件带一大堆运算部件。但是英伟达希望能解决掉SIMD的这两个痛点。首先从指令集的设计上,指令就还是像SISD一样,几元运算就是几个操作数,只不过在执行的时候,调度器会给这条指令分套很多套的计算元件和寄存器。这么做带来的第一个好处就是,这样的可执行代码就很容易通过一个一套类似高级语言多线程的编程模式编译而来。这个模式就是大家熟知的CUDA,至此第一个痛点就解决了。上面所说的“一套运算部件和寄存器”,在用户看来就像是一个线程一样,所以这种模式被起名为SIMT。进一步,英伟达给这些指令提供了很多修饰符,比如一个Bit Mask可以指定哪些线程干活,哪些空转,那基于这个设计,SIMT就能很好地支持分支语句了。这样使用起来就很灵活,解决了第二个痛点。


所以一句话总结英伟达提出SIMT的初衷就是,希望硬件像SIMD一样高效,编程起来还像多核多线程一样的轻松。


先写到这吧,有人看再更。




  

相关话题

  为什么说 CPU 是人造物的巅峰? 
  如何看待 NVIDIA 称「我们的 GPU 显卡比 CPU 节能 42 倍」? 
  为什么英特尔x86等多数中央处理器不支持源操作数和目标操作数同时为内存的指令? 
  是不是国产服务器cpu都要基于arm指令集开发? 
  龙芯的LoongArch是真正独立自主的指令集吗? 
  GPU可以直接读取内存吗? 
  手机的整体功耗大概是多少? 
  为什么矿机除了 ASIC 用的都是 AMD 显卡而不是Nvidia显卡? 
  为什么CPU/GPU的温度会在一瞬间波动十度以上? 
  如何看待PS5(PlayStation5)的soc内核照片(die shot)? 

前一个讨论
事与物在我们记忆中的存储方式是一样的吗,分别如何存储,有何异同?
下一个讨论
《失控玩家》中的游戏有可能实现出来吗?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利