好久不见|一个循环,cpu搞了个新技术!( 二 )


“我上面举的例子只是一个简单的情况 , 并行计算还可能不是固定的数 , 可能是一个数组和另一个数组相加 。 还有可能不是整数相加 , 而是浮点数 , 甚至 , 还可能不是加法 , 而是减法或者乘法 , 再或者不是算术运算 , 而是逻辑运算”
我刚一说完 , 大家又开始窃窃私语交流起来 。
“我琢磨着你说的这一系列东西 , 咱们是要新增一套专门用来并行计算的指令集啊” , 小虎说道 。
“这可是大工程啊”
“是啊???”
这时 , 小六又问道:“咱们的计算的时候 , 都是把数据读取到寄存器进行的 , 可这寄存器一次只能装一个数 , 怎么一次读取多个数据呢?”
“可能需要新增一些容量大一些的寄存器 , 比如128bit长度 , 可以同时容纳4个32位的整数”
好久不见|一个循环,cpu搞了个新技术!
文章图片
“有这个必要吗?咱们是通用CPU , 又不是专门做数学计算的芯片 , 搞这些东西干嘛?” , 四号车间代表提出了质疑 。
我也不甘示弱:“那可太有必要了 , 在图像、视频、音频处理等领域 , 有大量这样的计算需求 , 咱们得提升处理这些数据的能力”
见我们争执不下 , 领导拍了拍桌子 , 会场一下安静了下来 。
“我觉得阿Q说的有道理 , 咱们确实需要提升处理这类数据运算的能力了 。 不过不用一下搞那么复杂 , 先支持整数并行运算就行了 。 新增寄存器这个也不用着急 , 可以先借用一下浮点数运算单元FPU的寄存器 。 这件事先这么定下来 , 具体的方案你们再继续讨论 。 ” , 说完便离开了会议室 。
领导不愧是领导 , 几句话就把我们安排的明明白白 。 SIMD
又经过一阵紧张的讨论 , 我们终于敲定了方案 。
我们借用浮点数运算单元的寄存器 , 还给它们起了新的名字:MM0-MM7 。 因为是64位的寄存器 , 所以可以同时存储两个32位的整数或者4个16位整数或者8个8位的整数 。
我们还新增了一套叫MMX的指令集 , 用来并行执行整数的运算 。
好久不见|一个循环,cpu搞了个新技术!
文章图片
我们把这种在一条指令中同时处理多个数据的技术叫做单指令多数据流(SingleInstructionMultipleData) , 简称SIMD 。
有了这套指令集 , 咱们处理这类整数运算问题的速度快了不少 。
不过渐渐地发现了两个很麻烦的问题:
第一个问题 , 因为是借用FPU的寄存器 , 所以当执行SIMD指令的时候 , 就不能用FPU计算单元 , 反过来也一样 , 同时使用的话就会出乱子 , 所以要经常在不同的模式之间切换 , 实在是有些麻烦 。
另一个更重要的问题 , 咱们这套指令集只能处理整数的并行运算 , 可现在浮点数的并行运算越来越多 , 尤其是图像、视频还有深度学习的一些数据处理 , 浮点数情况越来越多 , 这时候都派不上用场 。
我们把这些问题给领导做了汇报 , 看到我们已经做出的成绩 , 领导终于同意继续升级 。
这一次 , 我们扩展了一套新的SSE指令集出来 , 新增了XMM0-XMM7总共8个128位的寄存器 , 再也不用跟FPU共享寄存器了 。 而且位宽加了一倍 , 能容纳的数据更多了 , 能同时处理的数据自然也变多了 。
好久不见|一个循环,cpu搞了个新技术!】后来 , 我们又不断的修改升级 , 不仅支持了对浮点数并行处理 , 还推出了新一代的AVX指令集 , 把寄存器再一次扩大为256位 , 现在我们的SIMD技术更加先进 , 处理数据运算的能力越来越强了!