看了楼上,只有一个类比搬砖的回答说的还行,我来说个更直接更详细的吧。
在这二者出现之前,占主导的都是SISD(Single instructrue single data),但很快人们发现不少场景的特点是逻辑简单,计算量大,而且从算法的角度这些计算还能并行做。那么最直接的想法是多搞几块芯片并行算呗,就是多核系统,对应到编程层面就是多线程编程的模型。
这么个产物呢,编程编起来是还挺爽的,稍微解决一下多线程互斥,同步之类的小问题就好了。但很快就有人想起来,不对啊,这么做从硬件的角度看很不划算啊,我只是为了能并行地计算,按理说只要多搞几套计算元件和寄存器就好了,现在连指令元件,比如取指,比如译码,比如发射,都给我搞了好几套,这不是浪费吗?所以很快又有机智的人解决了这个问题,让一套指令部件能够带动很多套元算部件,这套硬体现在指令集层面就是,单条指令的操作数,从原来的几个,变成了可以一大堆。这就是SIMD。
但是SIMD很快人们就发现了两个痛点。第一,高级语言不好支持,基本上都是靠直接在C语言里嵌汇编来用,这就很痛苦,整得明白的人也不多。第二,用起来很不灵活,比如有时候我一部分位置要做计算,一部分位置不用做计算,这就很难整。人们开始怀念起了多线程编程的轻松快乐。
再然后就到了一家有野心的公司叫英伟达。从硬件层面,GPU本质上跟前面提到的SIMD一样,少量的指令部件带一大堆运算部件。但是英伟达希望能解决掉SIMD的这两个痛点。首先从指令集的设计上,指令就还是像SISD一样,几元运算就是几个操作数,只不过在执行的时候,调度器会给这条指令分套很多套的计算元件和寄存器。这么做带来的第一个好处就是,这样的可执行代码就很容易通过一个一套类似高级语言多线程的编程模式编译而来。这个模式就是大家熟知的CUDA,至此第一个痛点就解决了。上面所说的“一套运算部件和寄存器”,在用户看来就像是一个线程一样,所以这种模式被起名为SIMT。进一步,英伟达给这些指令提供了很多修饰符,比如一个Bit Mask可以指定哪些线程干活,哪些空转,那基于这个设计,SIMT就能很好地支持分支语句了。这样使用起来就很灵活,解决了第二个痛点。
所以一句话总结英伟达提出SIMT的初衷就是,希望硬件像SIMD一样高效,编程起来还像多核多线程一样的轻松。
先写到这吧,有人看再更。