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

好久不见 , 我叫阿Q , 是CPU一号车间的员工 。 我所在的CPU有8个车间 , 也就是8个核心 , 咱们每个核心都可以同时执行两个线程 , 就是8核16线程 , 那速度杠杠滴 。
我所在的一号车间 , 除了负责执行指令的我 , 还有负责读取指令的小A , 负责指令译码的小胖和负责结果回写的老K , 我们几个各司其职 , 一起完成执行程序的工作 。 一个简单的循环
那天 , 我们遇到了一段代码:voidarray_add(intdata[],intlen)forinti=0;ilen;i++data[i]+=1;}}
循环了好几百次之后 , 才把这段代码执行完成 , 每次循环都是做简单又重复的工作 , 把我累得够呛 。
一旁负责结果回写的老K也是累的满头大汗 , 吐槽道:“每次都是取出来加1又写回去 , 要是能一次多取几个数 , 批量处理就好了”
老K的话让我眼前一亮 , 对啊 , 能不能批量操作呢?
心里一边想着 , 一边继续干活了 。
繁忙的一天很快结束了 , 转眼又到了晚上 , 计算机关机后 , 我把大家召集了起来 。
“兄弟们 , 还记得咱们白天遇到的那个循环吗?”
“你说哪个循环 , 咱们这一天可执行了不少循环呢” , 小A说到 。
“就是那个把整数数组每个元素都加1的那个循环”
“我想起来了 , 那循环怎么了?有什么问题吗?”
我看了老K一眼 , 说道:“我在想今天老K的话 , 像这种循环 , 每次都是取出来加1又写回去 , 一次操作一个数 , 效率太低了 , 咱们要是升级改造一下 , 支持一次取出多个数 , 批量加1 , 这样岂不是快很多?”
好久不见|一个循环,cpu搞了个新技术!
文章图片
老K一听来了兴趣 , “这敢情好 , 你打算怎么做?”
“这我还没想好 , 大家有什么建议吗?”
一旁负责指令译码的小胖说道:“可以新增一条指令 , 专门用来一次取出多个数据来加1”
“不行不行 , 不能限的这么死 , 今天是加1 , 万一下次是加2呢?指令里面不能限制为1”
“那如果每个数据要加的是不一样的怎么办?”
“你这么一说 , 那万一不是加法 , 是减法 , 乘法怎么办?”
“还有啊 , ???”
大家开始七嘴八舌讨论了起来 , 没想到一个小小的加法循环 , 一下子引出了这么多问题来 , 这是我们没想到的 。 并行计算
随着讨论的深入 , 我觉得已经超出了咱们一号车间能把控的范围 , 需要上报给领导 , 组织八个车间代表一起来商讨 。
领导一听说有提高性能的新技术 , 马上来了兴趣 , 很快便开会组织大家一起来商讨方案 。
好久不见|一个循环,cpu搞了个新技术!
文章图片
“都到齐了是吧 , 阿Q你给大家说一下这个会议的目的” , 领导说到 。
我站了起来 , 开始把我们遇到的问题和想法跟大家讲了一遍 。
“是这样的 , 我们一号车间那天遇到了一段循环代码 , 循环体的内容很简单 , 就是给数组中的每一个元素加1 。 我们执行的时候 , 就是不断取出每一个元素 , 然后将其执行加法计算后 , 再写回去 。 这样一个一个来加1 , 我们感觉太慢了 , 要是可以一次多取几个 , 并行加1 , 那一定比一个一个加快上不少 。 ”
我刚说完 , 大家都开始小声议论起来 。
“我看出来了 , 这其实就是并行计算!” , 二号车间小虎一语道出了关键 。
六号车间小六问道:”阿Q , 你们已经有方案了吗?“
“还没有 , 这正是今天开会的目的 , 因为情况有点复杂 , 还需要大家一起来出出主意”
“好像并不复杂嘛”