那天我们遇到了一段代码void array_add(int data[], int len) { for (int i 0; i len; i) { data[i] 1; } }循环了好几百次之后才把这段代码执行完成每次循环都是做简单又重复的工作把我累得够呛。一旁负责结果回写的老K也是累的满头大汗吐槽道“每次都是取出来加1又写回去要是能一次多取几个数批量处理就好了”老K的话让我眼前一亮对啊能不能批量操作呢心里一边想着一边继续干活了。繁忙的一天很快结束了转眼又到了晚上计算机关机后我把大家召集了起来。“兄弟们还记得咱们白天遇到的那个循环吗”“你说哪个循环咱们这一天可执行了不少循环呢”小A说到。“就是那个把整数数组每个元素都加1的那个循环”“我想起来了那循环怎么了有什么问题吗”我看了老K一眼说道“我在想今天老K的话像这种循环每次都是取出来加1又写回去一次操作一个数效率太低了咱们要是升级改造一下支持一次取出多个数批量加1这样岂不是快很多”老K一听来了兴趣“这敢情好你打算怎么做”“这我还没想好大家有什么建议吗”一旁负责指令译码的小胖说道“可以新增一条指令专门用来一次取出多个数据来加1”“不行不行不能限的这么死今天是加1万一下次是加2呢指令里面不能限制为1”“那如果每个数据要加的是不一样的怎么办”“你这么一说那万一不是加法是减法乘法怎么办”“还有啊···”大家开始七嘴八舌讨论了起来没想到一个小小的加法循环一下子引出了这么多问题来这是我们没想到的。并行计算随着讨论的深入我觉得已经超出了咱们一号车间能把控的范围需要上报给领导组织八个车间代表一起来商讨。领导一听说有提高性能的新技术马上来了兴趣很快便开会组织大家一起来商讨方案。“都到齐了是吧阿Q你给大家说一下这个会议的目的”领导说到。我站了起来开始把我们遇到的问题和想法跟大家讲了一遍。“是这样的我们一号车间那天遇到了一段循环代码循环体的内容很简单就是给数组中的每一个元素加1。我们执行的时候就是不断取出每一个元素然后将其执行加法计算后再写回去。这样一个一个来加1我们感觉太慢了 要是可以一次多取几个并行加1那一定比一个一个加快上不少。”我刚说完大家都开始小声议论起来。“我看出来了这其实就是并行计算”二号车间小虎一语道出了关键。六号车间小六问道”阿Q你们已经有方案了吗““还没有这正是今天开会的目的因为情况有点复杂还需要大家一起来出出主意”“好像并不复杂嘛”“我上面举的例子只是一个简单的情况并行计算还可能不是固定的数可能是一个数组和另一个数组相加。还有可能不是整数相加而是浮点数甚至还可能不是加法而是减法或者乘法再或者不是算术运算而是逻辑运算”我刚一说完大家又开始窃窃私语交流起来。“我琢磨着你说的这一系列东西咱们是要新增一套专门用来并行计算的指令集啊”小虎说道。“这可是大工程啊”“是啊···”这时小六又问道“咱们的计算的时候都是把数据读取到寄存器进行的可这寄存器一次只能装一个数怎么一次读取多个数据呢”“可能需要新增一些容量大一些的寄存器比如128bit长度可以同时容纳4个32位的整数”“有这个必要吗咱们是通用CPU又不是专门做数学计算的芯片搞这些东西干嘛”四号车间代表提出了质疑。我也不甘示弱“那可太有必要了在图像、视频、音频处理等领域有大量这样的计算需求咱们得提升处理这些数据的能力”见我们争执不下领导拍了拍桌子会场一下安静了下来。“我觉得阿Q说的有道理咱们确实需要提升处理这类数据运算的能力了。不过不用一下搞那么复杂先支持整数并行运算就行了。新增寄存器这个也不用着急可以先借用一下浮点数运算单元FPU的寄存器。这件事先这么定下来具体的方案你们再继续讨论。”说完便离开了会议室。领导不愧是领导几句话就把我们安排的明明白白。SIMD又经过一阵紧张的讨论我们终于敲定了方案。我们借用浮点数运算单元的寄存器还给它们起了新的名字MM0-MM7。因为是64位的寄存器所以可以同时存储两个32位的整数或者4个16位整数或者8个8位的整数。我们还新增了一套叫MMX的指令集用来并行执行整数的运算。我们把这种在一条指令中同时处理多个数据的技术叫做单指令多数据流Single Instruction Multiple Data简称SIMD。有了这套指令集咱们处理这类整数运算问题的速度快了不少。不过渐渐地发现了两个很麻烦的问题第一个问题因为是借用FPU的寄存器所以当执行SIMD指令的时候就不能用FPU计算单元反过来也一样同时使用的话就会出乱子所以要经常在不同的模式之间切换实在是有些麻烦。另一个更重要的问题咱们这套指令集只能处理整数的并行运算可现在浮点数的并行运算越来越多尤其是图像、视频还有深度学习的一些数据处理浮点数情况越来越多这时候都派不上用场。我们把这些问题给领导做了汇报看到我们已经做出的成绩领导终于同意继续升级。这一次我们扩展了一套新的SSE指令集出来新增了XMM0-XMM7总共8个128位的寄存器再也不用跟FPU共享寄存器了。而且位宽加了一倍能容纳的数据更多了能同时处理的数据自然也变多了。后来我们又不断的修改升级不仅支持了对浮点数并行处理还推出了新一代的AVX指令集把寄存器再一次扩大为256位现在我们的SIMD技术更加先进处理数据运算的能力越来越强了