如何获取4399ios小游戏swift源代码的源代码 简书

关于我经历的前端面试 - 简书
关于我经历的前端面试
从九月至今面试过的公司不多,也就三四个感触倒是挺多的以下评价带有很强烈的个人色彩不喜欢的出门右转,谢谢第一家公司: ThoughtWorks 很幸运可以参加TW内推面试,我真的也是很喜欢这家公司。对我而言,面试的经历很曲折,可是这也无法改变我对TW的喜爱程度。负责技术面的面试官很人性化,不仅考虑到了对专业知识的掌握程度,还关注于学习能力和发展潜力。因为是第一家面试的公司,我自己能力也挺差的,太紧张差点哭了出来。期间面试官还转移了话题,安慰我不要太紧张。最后还主动告诉我,我的不足在哪里,以及改进的方法。感激,第二家公司: 绿盟很可能是因为我面试官的原因吧,虽然知道地图炮是不对的,可是还是很想吐槽。最开始是因为,我比他们通知的时间早到了十几分钟,结果被告知,他们早晨面试的快,叫到我的时候我还没来。EXO ME?这个真的不是我的问题吧。还有就是,觉得不是很关注我到底会什么技术,而关注他们需要的技术我会不会。然后聊了没多久,面试官就让我回去等通知。好的,稳挂,再见。第三家公司: 43994399小游戏可算是我从小就接触了的,还算有点感情吧。去面试的时候,真的等了好久,大概有一个多小时才到我。面试官很注重基础,也偏重于简历上掌握的知识和项目经历。问的知识面很广,而且都是很基础的,还关注了浏览器兼容性的问题,这个我在之前真的没有注意过。也比较关注于我会什么,掌握的如何。同时,也耐心的跟我解答了一直困扰我的问题,主动给我提了今后学习建议。感激,第四家公司: 欢聚时代对于欢聚也算有很深的感情,毕竟爱玩游戏的妹子基本都用过YY。面试官偏向于TW的面试风格,相对于其他公司更注重学习方法,他会问一些,你怎么解决问题,怎么学习等方面的问题。全程给给人的感觉就是在交流,而不是在面试。即使他后来公式化的问了你对我们公司有什么想要了解的问题,也让我觉得很真诚。而且说了如果今后想要从事前端方面的工作的话,提了一些相关的学习建议。同样感激,希望这篇文章并没有透漏什么不该透漏的商业机密总体来说遇到的面试官大部分都很好只是自己太水我的面试生涯差不多也结束了以后就可以安心的做自己想做的乱七八糟的事情最后希望看到这篇文章的你们可以找到一份好的工作或者是可以有机会做自己想做的事人生不长不短珍惜现在
一切都是最好的安排
毕业后几年一直待在广州,觉得这是一个比较生活化及务实的城市,其互联网公司和相应的投融资环境都不如北深上活跃,大大小小的面试也有几十个,有点规模的公司应该都面试过了,面试一般会见到主力技术人员,技术主管,技术总监,人力几个人,狭义上还是可以看出一些公司文化技术氛围滴,于是想写...
未经版权许可,严禁转载,必究到底! 毕业后几年一直待在广州,觉得这是一个比较生活化及务实的城市,其互联网公司和相应的投融资环境都不如北深上活跃,大大小小的面试也有几十个,有点规模的公司应该都面试过了,面试一般会见到主力技术人员,技术主管,技术总监,人力几个人,狭义上还是可以...
2016 腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr 面,共 5 轮 - 后端 - 掘金(出处:http://www.cnblogs.com/linguanh/) 前序: 距离2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息。...
半年前,朋友和我说,写下校招总结吧,给师弟师妹和自己一些小建议,也是蛮有趣的事。 先简单介绍下背景。16届,广东某985、211大学,信息工程,工科女,意向是产品岗。来个全面的提纲先: 校招前的准备 --不打无准备之战 在校招前期,笔者还在一家创业公司实习,请假去参加校招。...
作为一名刚经历了校招季的大四狗,特别是恰逢遭遇今年“互联网寒冬”,这两三个月来可以说是内心非常复杂微妙的一段时间,但同时自我感觉成长了不少、感悟了不少,特此想在这里写点东西,给将来的自己今后回头看也好,给师弟师妹们稍微做个经验分享也好,这也是我在简书上第一次写文章,思路紊乱...
前言 正式系统中,涉及到用户权限的管理,需要新增多个用户并赋予权限 方法 登录Jenkins,依次打开“系统管理”-“Configure Global Security” 勾选“启动安全”,“访问控制”处,勾选“允许用户注册” “授权策略”处,勾选“项目矩阵授权策略”,添加...
我就是想做自己喜欢的事情
by 美合日古丽 知乎网上看到一个话题:— 你的大学孤单吗?— 孤单啊!但是谁不是呢?!— 你们觉得孤单,我为什么觉得是清静呢?!— 孤单成瘾。能跟自己玩的开心是大学get的最得意技能!“你们觉得孤单,我为什么觉得是清静呢?!”这句话真的是说出...
读孔孟,我会读到博爱,读老子,我会读到超脱。一直在故纸堆里寻找老子的身影,觉的老子所在社会,一定是一个畸形的社会,一个风气败坏、人格扭曲的社会,如果不是一个扭曲的社会,也将会是一个扭曲的人格,一个倒骑青牛、飘然而去的人不是一个正确的社会人。老子的哲学在某种程度上与西方的一种...
决定每天都码一点字。 同事推荐看了张小娴的《我这辈子有过你》,又名《三个A cup的女人》的小说。两个小时便翻完。三对恋人的痴缠纠结。其实还好,感触没有那么深。 要把《ONE DAY》拿来借人,又翻了翻内容梗概还有标记过的文字。二十年的朋友也好、恋人也罢,源头都逃不过二十之...我经历的IT公司面试及离职感受 - 简书
我经历的IT公司面试及离职感受
未经版权许可,严禁转载,必究到底!毕业后几年一直待在广州,觉得这是一个比较生活化及务实的城市,其互联网公司和相应的投融资环境都不如北深上活跃,大大小小的面试也有几十个,有点规模的公司应该都面试过了,面试一般会见到主力技术人员,技术主管,技术总监,人力几个人,狭义上还是可以看出一些公司文化技术氛围滴,于是想写这样一篇文章,介绍经历也给予朋友们看看。先介绍下自己的技术背景,二流大学计科毕业,GPA3.21/4.0,计算机专业课都有90分以上,高数基础不太好,也是我目前的瓶颈,程序语言基础不算差,外企,国企,民企都混过,做了6年的Android了,有3年是音视频和显示系统(Framework和Kernel),到门槛了。有3年是App方面,有几个千万月活的产品主程序经历,也是Google Play的顶尖开发者,随着泡沫入门了。另外也熟悉IOS和NodeJS,会写一些简单的前端,算个二吊子的全栈开发。所以,我真的只是个不算太差的三四流程序员,交待完背景,开始正文,下文涉及的公司主要有:甲骨文数据公司,三星通信研究院、腾讯;阿里巴巴、网易公司、欢聚时代、唯品会、猎豹移动;卓望公司、4399游戏、爱拍、PP金融、酷狗音乐、TCL多媒体。我一个个说,有在职的才有离职过程感受,只正式经历过3个工作东家和1个实习东家,其余都只是面试感受,看不下去可以乘搜索电梯直达。1.甲骨文数据公司
职位:C++ software engineer面试过程:开始有一轮群面,大概是有设计一个单元测试模块,测试一个万分之五概率的问题,找出缺陷,然后每个人分别陈述,没有Leader,我表现中规中矩,中途有个同学给了我比较好的修正思路。接下来有两轮技术面,因为是校招,都是基础知识,计算机原理为主,也有一些数据结构的分析,第二轮面试我的是一个非常Nice的瑞典帅哥,我英语不好,他非常耐心地讲解,也适当给予我提示。最后一轮是HR,一个笑眯眯的美国老头,中英文夹杂者,问一些生活问题,职业规划什么的,给人感觉非常亲切!值得一提的是,后来二面的面试官找我过去聊了聊,很真诚地指出我技术不足,以及给我解答了面试中我没有回答好的问题,也给我留了邮箱。问了参见面试的其他同学,都有约谈。离职:实习性质入职甲骨文,待的时间非常短暂,离职原因是因为我们需要从事18个月的技术支持和测试工作,在这个公司渡过了非常快乐的一段时间,欧美企业的自由平等企业氛围,极客的技术思维,都让我非常难忘,不管是在深圳还是大阪,工作方面它非常关注和鼓励你的自身提高和职业发展,生活上你完全不需要担忧,有什么困难反映给公司,马上就可以得到解决,譬如我初到深圳没地方住,只是和一个HR闲聊无意说了下,公司就为我们几个实习生租了房子。离职过程是在OA申请,他们也没有对其他同事遮遮掩掩,有过接触的同事都有发邮件祝福,也收到了公司和同事很多纪念礼物,反而让我有种即将登上新的鸿途的感觉。2.三星通信研究院
职位:C/C++ software engineer面试过程:开始有HR简单聊了一下,然后笔试,有10个不定项选择题,2个编程题,1个开放性的三列交叉排序算法题,整个笔试不难,感觉要得高分非常不容易,基础的广度和深度均需要顾及,接着就是两轮技术面试,笔试答错的题目都被抓出来问了,他会给予思路和背景知识,直到你弄懂了为止,有种上课的感觉,其他问的都是简历上的内容,譬如我大学的SCI论文是点阵识别方向,两个面试官都非常感兴趣,交流过程中他们都非常谦卑,不断问我是不是这样理解,没有很多公司面试官高高在上的SB感。最后是HR谈薪,他很坦诚说了其他面试官对我的评价和三星给我的薪资,也谈到了我将来入职的部门和工作,以及对我的期望和建议,他并没有说三星多好多好,反而让我比较目前已有的offer,选择适合自己的。离职:离职原因主要是我当时厌烦这种无限加班的环境,想换个工作环境,另外一方面是我从事了很久Android Framework和Kernel工作,很想去做Android App。离职过程不是非常顺利,我的HR,直属主管,直属主管的上司,广州研究院的负责人,大中华区的副总裁,都找我聊过工作和离职的问题,他们希望我留下,我的需求都尽量满足。虽然是程序式的面谈,但他们表现出的真诚和平和让你肃然起敬,他们对我个人几年后的发展也都给予了中肯的意见,我离职几年后,发现我的直属上级对我的职业发展也判断得非常准确,我觉得三星是一家伟大的企业,有这样一群人,他们会继续伟大。3.腾讯
职位:高级软件工程师面试感受:腾讯是非常重视效率的公司,工程师文化盛行,给我面试电话的是一个工程师,他说我是腾讯的软件工程师,近日收到你的简历,想找你聊聊。我还第一次接到非HR式的面试通知。过去后也是工程师接待我的,当时一直在想HR有什么可干的呢?技术面试分为四轮,第一轮是两个年轻的程序员,问一些项目背景啊,技术方向啊,也结合我的项目经验聊了实现原理之类,聊得还比较开心和轻松。第二轮是Team Leader,重复了一遍项目经验,他的侧重点在项目进度控制和风险控制方面,他也问了我的薪资要求及技术意向,也说明了他们目前需要一个什么类型的人才。第三轮是专家评审,他们的侧重点在于计算机基础知识,项目实现原理,数据结构和算法,他们采取让你先陈述,然后由浅入深提问,层层递进铺开的面试思路,非常专业,这相比很多公司面试喜欢冷门的技术细节,不知道高到那里去了,这轮面试有很多开放性的问题,我回答时他们也会帮我纠正错误,整理思路。第四轮是技术总监面,这哥们穿着真太随意了,他好像比较忙,一直不断在电脑上敲,只问了我两个问题,说说你从业生涯中遇到的最大技术难题和解决过程,说说你熟悉的两个开源项目以及项目背景和原理。我在小白板上写和说,过程中他很少说话,过程中他一直:然后呢?还有呢?最后看了一会小白板就走了,我一直纳闷他到底听了没有。最后就是HR,她说该了解的都了解了,你有什么问题问我没有,我简单问了几个公司结构的问题,然后她就和我谈薪资了,肯定是我开的薪资太低了啊,吐血啊啊啊,她淡淡说了一句,这个薪资没问题,我们一周左右给你发offer就结束了。离职:腾讯是技术氛围挺好的公司,没有阶层观念,有很多技术分享,有舒适的工作环境,不太大的工作压力(和我的team有关),好吃的工作餐,棋逢对手的三国杀,如果不是那个看起来美好的创业机会,我想我会呆在这里很久很久。离职过程比较顺利,各级主管约谈,我也和他们坦诚我想出去闯一闯,也有同事帮我分析这个机会,以及给予了我一些资料,我的直属主管很认真说,你在外面感觉不爽时,也欢迎你随时能够回来一起奋斗,事业群负责人Allen也回了一小段祝福和welcome
back的邮件,而不是冷冰冰的同意!后来我在外面诸多不顺时,首先想到的是还是回腾讯吧!4.阿里巴巴
职位:高级软件工程师面试过程:阿里的HR语言态度总会他们觉得自己低了一等,程序式的语言和高高在上的态度,必须给个差评。技术面试分为两轮,一轮主管面,主要是项目背景知识,计算机基础,数据结构和算法相关,面试的氛围也非常好,先介绍自己,然后问问题也没有什么刁钻的技术细节,最后的开放性问题,我觉得他提的问题是欠思考的,所以回答过程中他不断补充,导致问题已经被彻底带偏了,我们都笑场了,他给人的感觉还挺冷漠的,我片面觉得也许以后的日子也不太好过。一轮是总监面,主要是项目经验和实际问题,有一个开放性的搜索算法,人非常好,不断抬起头询问式说话。HR和我谈薪资还是维持那种爱来不来,大把人抢着来的心理,也不是根据面试结果和技术评级来的,比较随意的压价。5.网易公司
职位:高级软件工程师面试过程:网易对自己需要的人有非常明确的需求,所以当我技术面试的时,基本都是多媒体相关(我做过三年左右的Android多媒体系统),第一轮面试集中在多媒体编解码算法和Android StageFright实现,两个面试官,轮流轰炸,1个小时下来,觉得非常疲惫,口也非常渴。所以到第二轮面试的间歇期,我准备悄悄出去倒水,开门迎面碰到第二轮的总监面试官,我说我去倒水喝啊,被虐得口渴了,他忙不迭放下电脑,说我给你去倒吧,我清楚地儿在哪儿。我喝完休息了下,简单介绍了自己和项目经验,他中途没有插话,不断在简历上写,写得满满的,然后就一个个问我,还是在多媒体方面为主,架构方面他就让我在白板上画,画完就懂,有时候你会感觉和高智商的人交谈就是这么顺利,你们很快相互理解满满默契。网易HR就是刚开始的带我去技术面试,后来和我谈薪资的那位姐姐,因为当时18点了,还带我去网易的食堂吃了一顿,三荤一素一汤,真挺好吃的,不得不说有自己食堂的公司是福利公司啊!6.欢聚时代
职位:高级软件工程师面试过程,欢聚时代在环境优美的羊城创意园里面,进门有保安,非要往我身上贴了贴纸,前台MM还给了我一个长长的表要填,很多公司在面试的时候就让你把你的所有社会背景全填一遍,在没有达成合作关系前,其实我真的非常非常介意填这个涉及隐私的背景调查,选择Offer也自动下调一档,不知道HR怎么看待这个问题的,我没收到offer时不想入你们的所谓人才库,也不愿记录任何社会背景给你!技术面试有三轮,第一轮面试官都是根据简历问的,问的东西都比较简单,以至于我后来问他是不是需要找Android高级软件工程师。第二轮是一个白白胖胖的中年人,面试内容主要集中在Android客户端架构和重难点解决,Android系统组件的实现原理方面,也有涉及多线程模型,聊得比较开心,问题是我一直没有喝水,好渴啊!第三轮是一个瘦瘦的头发梳得油亮油亮的中年人,主要问我一些架构和编解码算法方面,比较深入,我们也讨论了YY语音客户端的架构和存在的问题,面试过程没有偏门的技术细节,都是问我接触过的东西,他也一直保持微笑,面试体验挺好。他出去了我等了很久,喝完了三杯水,还是木人来,我主动给HR电话他才匆匆过来,他问了一些职业规划和技术意向,也说了我的技术评级非常优秀,说帮我讨论和申请薪资。7.唯品会
职位:高级软件工程师面试过程:唯品会总部距离我住的地方好远,HR第一面,问了我离职原因和选择唯品会原因(其实我真是过来聊聊,面试愉快才能选择你啊!),还认真帮我梳理了一路以来的职业发展,虽然我不知道有什么用,还是觉得很深奥的样纸。技术面试有两轮,第一轮不太顺利,我比较少接触H5混合型的App,唯品会是这个类型,也有很久没有接触javascript了,所以表现非常一般。二轮面试主要是聊App架构和性能相关的问题了,这些我比较熟悉,所以相对来说有点心得,面试官对我也还比较满意。总体感觉唯品会并不是一个技术公司,估计以后的业务压力会很大。末了也和唯品会的一个老朋友聊了会儿,我们一致认为,这里并不是一个热爱技术的最好选择。8.猎豹移动
职位:高级软件工程师面试过程:猎豹近年快速发展,也是我一直想加入的公司之一,只是我一直不知道广州有研发分公司,直到后面听一个朋友说的,于是就过来聊聊了。首先是前台MM给我一张我很介意的背景调查让我填写,尽管不想填,还是耐性填了,有一份比较简单的笔试题需要做,题目主要还是一些线程,消息之类的Android基础题,感觉并没有根据级别来出题。技术面试有三轮,首先是一个酷酷的灰衫人,问题集中在计算机基础上,项目背景我介绍完了他也比较简单问了一些问题,相对而言会少涉及Android开发,深度也有所欠缺,他理解能力非常好,有些专业性问题看得出来他没有接触过,但是很快就可以理顺,途中他有问我这个面试题怎样,我坦诚回答对我而言知识点深度广度有所欠缺,如果有针对性会更好。二轮是一个看起来很Nice的年轻哥们,面试过程一直保持微笑,口头禅是为啥?面试内容上项目经验涉及会比较多,也有一些设计模式和数据存储相关,项目周期和风险控制也有所Check,总体下来理论为主,技术点比较少比较浅,面试聊得挺愉快滴。三轮是总监面,大部分问题围绕在你有什么优点,相对其他程序员有什么优势,有没有某个项目因为你加入而变得不同,前两轮也有一些这类问题,但不像这轮变成一个针对点,确实有一些项目组因为我的加入变得不同,但并没有发生过质的裂变,虽然这种问题有压价铺垫的嫌疑,我一直觉得开源技术的发展已经让整个互联网行业变化,相对上个时代,团队才是决定因素,但整个面试都有这类问题,也能侧面反映出公司有个人主义趋向。最后是HR谈薪,HR帅哥很赞很爽快,没有很多公司的职业套路和夸夸其谈,我的面试评价挺好,薪资要求超过了总监决定范围,他说去申请,很快就收到了offer。离职:在猎豹呆的时间短暂,和同事的相处挺好的,经常在一个小台球桌上玩儿(一面的灰衫人花样虐菜我),业余活动也很丰富,有健身房和滴滴,加班很多(22点离开算早),行政MM各个节日活动都很用心,年会也非常高大上玩得很嗨森。在这里从事了很多业务方向的编码,猎豹有一些原有的通用模块,但大部分已经无法适应要求,每个项目都需要造一次轮子,努力想推进一些通用模块的编码,很难有机会和支持,虽然一直觉得不适应,觉得这并非一个有技术氛围的公司,开发地位相当低,但还是想努力改变自己来适应环境。真正促使我离职是转正评审,其实我觉得自己在猎豹的输出还是不少的,有诸多槽点,也相信自己是至少及格的,转正评审投影一直不太好用,时有时无的,我分别从项目输出、技术输出几个方面说了,期间参与评审的两个上司一直在玩手机,讲完后却说我未说过对项目的贡献,几乎全盘否定了我在通用技术的输出,内部通用组件和开源方案也觉得没有任何意义,有一种野路子出身的土军阀感,当时本想辩解九层之台起于累土。但因为另一位同事插话说我某个项目PPT写成全是自己做的(其实只有少部分),业务方面的业余程度让我震惊,心累没话说了(不与傻子论短长),后来只能离职。离职原因一方面是我本身对猎豹广研疯狂加班的文化不适应,另一方面是想换个更适合技术人员发展的环境,离职感受一般,我前后对所有工作上有过支持和合作的同事都表示了感谢,期间签字领导保持漠不关己的麻木感,缺少人与人之间的基本尊重,觉得欣慰的是最后收到入职帅哥HR一个离职祝语的小卡片,上面的打油诗让我觉得离职猎豹还是有所遗憾。9.卓望公司
面试岗位:Android软件工程师面试过程:卓望在高大上的富力中心,卓望也有和很多外包人力公司合作,浪潮和卓望我先后面过,大致过程差不多,有一轮笔试题,主要是Android四大组件,网络协议,设计模式相关,据说我得分还非常高。技术面试有两轮,我在卓望之前较少涉及上层应用的开发,面试还挺忐忑的,第一轮面试是一个萌萌的程序员,他在我们技术细节前都会说一声,生怕问倒我,我主要是讲了Android音频系统相关的内容,他也问得很谨慎,看起来是一个非常温和的人,后来的工作也证明了这点。二轮面试也是一个很Nice的人,他问得问题也相对简略,笑得很夸张哈哈哈,主要是http,UI界面相关的内容,可能是我在Android系统层干得太久,不知道外面的世界是怎么样了。离职过程:在卓望待了两年多,在两年是我在APP开发最快成长的两年,轻松愉快的工作氛围,有足够的时间编码及研究新技术,业余时间也写了很多优秀且赚钱的游戏和App,被Google Play评定为Top developer,考系统分析师得了省第二名,认识了很多工作努力玩得更努力的同学,他们有非常多创业成功的,后来他们给予了我很多帮助。离职原因是我在卓望成长还算挺快,发展空间开始显得比较低,我也不想在这个国企氛围的公司慢慢熬下去,离职前上司找我谈话,他是一个很真诚豪爽的人,欣慰我的成长,说我知道留不住你,于是很热心地帮我分析我手上的Offer和创业机会,虽然最终没有按照他的建议选择,但还是非常感谢他,和他给我的建议。离职签字时除苦瓜脸行政外,大部分人都还蛮诚恳地祝福,李财神爷和我开玩笑说,苟富贵勿相忘。10.4399
岗位:高级软件工程师面试过程:4399是页游时代非常出色的公司,一直觉得他很神奇,一年到头都在招同一岗位的人,我也收过很多次邀请,去面试是今年的4月份,它从科韵路搬到岗顶这边了,在面试之前我和HR沟通过几次,我是担心自己不符合他们的要求(又老又贵)。先是HR和我聊了下,问了我一些技术问题,主要是音视频方面的,HR还是对音视频有初步的理解,纳闷的是,难道HR这步觉得不满意就会刷人?接着是两轮技术面试,一轮是负责平台开发的王总,说话挺温和的,问了我一些项目背景,技术选型之类的问题,集中在音视频和流媒体方面,比较浅。一轮是客户端开发的哥们,项目背景又重新背书了一遍(第三遍了),技术点是主要集中在音视频方向,客户端架构和性能简单问了几句,技术方面比较浅,聊了一会他们即将做的项目和自研视频云项目,还觉得不错,我也尽自己所知给予了一些不一定中用的建议。整个感受就是技术氛围还不错,可能有一些发展空间,办公环境一般,有点压抑。
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
毕业后几年一直待在广州,觉得这是一个比较生活化及务实的城市,其互联网公司和相应的投融资环境都不如北深上活跃,大大小小的面试也有几十个,有点规模的公司应该都面试过了,面试一般会见到主力技术人员,技术主管,技术总监,人力几个人,狭义上还是可以看出一些公司文化技术氛围滴,于是想写...
2016 腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr 面,共 5 轮 - 后端 - 掘金(出处:http://www.cnblogs.com/linguanh/) 前序: 距离2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息。...
Java 基础思维导图,让 Java 不再难懂 - 工具资源 - 掘金思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具。了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的时候一目了然,快速知道自己的短板。 思维导图...
挺累。 为了某个目标而排除万难的努力,没坚持到最后都是白瞎。 跟自己较劲有时看起来挺傻,但有时也挺酷。
一部关于留守儿童的长诗 标签:记忆 留守 原野 长河 老人 童年
这是一个人的记忆,这是一群人的记忆,这是一个时代的记忆
赤条条,从一个未知的世界,走到另一个未知的世界,第一声啼哭打破宇宙的宁静,长路漫漫走来,谁还记得母亲肚里的温暖?谁还记得年幼时某人怀抱里的气息?
【Step1】选摘 使用记录,使自己能够记住更多经验。我原本以为,如果能够保持良好的记录习惯,自己就不会犯同样的错误,可我最终发现,有些错误是因习性甚至人性本身而生的,所以,即便保持做记录的习惯,也不可能完全避免,但毫无疑问的是,我依靠做记录的方法避免了多次犯同样错误的危险...
先公布好消息,我们的战友陈周清同学归队,让我们热烈欢迎!小组践行15人,准时交作业15人,按要求互评14人,战友们太棒了! 本期优秀文章推荐: 007-88l郑宏基l《要像保养爱车一样的保养你自己》l简书:糊糊生威 推荐理由:虽然写的不是最有文彩的,但真的是最有用的。 金句...
题记 2016年 2月24日-3月6日,在厦门海沧天竺山进行为期十天的内观修行,十天的体验很美好,我想和你分享我的体验。如果你也想尝试内观修行,我想请你忘掉这篇文章提及的禅修方式。佛陀说:你必须自修,自悟;已到对岸的人,只能指出那条路而已。 内观简介 内观(Vipassan...&p&如果老师讲得是对的,还有情可原,错了还这种态度我觉得没法洗……&/p&&p&所以为什么要上这种老师的mooc啊???作为前助教,强烈推荐清华大学&b&邓俊辉&/b&老师的&b&数据结构&/b&(与算法)。&a href=&//link.zhihu.com/?target=https%3A//www.xuetangx.com/courses/course-v1%3ATsinghuaX%2BBsp/about& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据结构(上)(自主模式)-学堂在线-最大的中文慕课(mooc)平台&/a&&/p&&p&这位老师是我20年来见过最负责同时讲课水平最高的老师之一,教学态度严谨,讲课风趣幽默,人也没什么架子,助教水平&del&除了我&/del&都很高,上过课的人都赞不绝口!!!&/p&
如果老师讲得是对的,还有情可原,错了还这种态度我觉得没法洗……所以为什么要上这种老师的mooc啊???作为前助教,强烈推荐清华大学邓俊辉老师的数据结构(与算法)。这位老师是我20年来见过最…
大家都在说一些使用上的技巧,我觉得Canonical公司和M$做的这个才叫做奇技淫巧:&br&ubuntu是很多人的工作环境,开源的性质又让很多人愿意为ubuntu写有趣或者高效的软件,但更多人的日常生活都是建立在windows上的,为了让两者合二为一,大部分用的是Cygwin,我也用过一段时间,感觉文件系统不是很好用就没有在用下去了。而在在今年win10的年度更新中,Win10憋了大招:&br&&figure&&img src=&https://pic1.zhimg.com/50/eea9ee2e8f86054a6edecb_b.jpg& data-rawwidth=&1571& data-rawheight=&406& class=&origin_image zh-lightbox-thumb& width=&1571& data-original=&https://pic1.zhimg.com/50/eea9ee2e8f86054a6edecb_r.jpg&&&/figure&更新后我第一时间开启了这个功能,因为新笔记本还没有装putty,我干脆就用这个代替了它:&br&&figure&&img src=&https://pic2.zhimg.com/50/e8b93d6adeeefc4c57cf769a54a5b8a8_b.jpg& data-rawwidth=&1160& data-rawheight=&497& class=&origin_image zh-lightbox-thumb& width=&1160& data-original=&https://pic2.zhimg.com/50/e8b93d6adeeefc4c57cf769a54a5b8a8_r.jpg&&&/figure&然而好像也就止于此了,然而当我看到排名第一的答案后我立马热血了起来:&br&&figure&&img src=&https://pic1.zhimg.com/50/0f68e9cff4b87b4a5c9e6f70bb8a724e_b.jpg& data-rawwidth=&815& data-rawheight=&1079& class=&origin_image zh-lightbox-thumb& width=&815& data-original=&https://pic1.zhimg.com/50/0f68e9cff4b87b4a5c9e6f70bb8a724e_r.jpg&&&/figure&ほら!&br&&figure&&img src=&https://pic4.zhimg.com/50/95b0c876a_b.jpg& data-rawwidth=&1919& data-rawheight=&1079& class=&origin_image zh-lightbox-thumb& width=&1919& data-original=&https://pic4.zhimg.com/50/95b0c876a_r.jpg&&&/figure&&figure&&img src=&https://pic3.zhimg.com/50/879d5bcda2a7b9ffb5763b_b.jpg& data-rawwidth=&1917& data-rawheight=&1075& class=&origin_image zh-lightbox-thumb& width=&1917& data-original=&https://pic3.zhimg.com/50/879d5bcda2a7b9ffb5763b_r.jpg&&&/figure&果然cmd更好看一点&br&现在正在等妹子回家,准备跟她秀一把&br&如果没被她白眼我再来更新~
大家都在说一些使用上的技巧,我觉得Canonical公司和M$做的这个才叫做奇技淫巧: ubuntu是很多人的工作环境,开源的性质又让很多人愿意为ubuntu写有趣或者高效的软件,但更多人的日常生活都是建立在windows上的,为了让两者合二为一,大部分用的是Cygwin,…
如果条件允许的话,我都是尽量不写main函数,不做GUI,所有的代码都用unit test来运行。我也不喜欢做mock,需要数据库的话就写个SQL脚本让他可以在空的数据库上生成一些我要的单元测试的数据,然后我的程序就真的连接到这上面跑。需要C/S就把两个测试进程(而非产品)都跑在同一台机器里面。如果你觉得很难做到,那多半是因为你的代码依赖了太多系统里的全局状态,导致你无法轻易地执行它。&br&&br&等到这些业务逻辑都搞定了,最后data binding上去,加上UI再跑code coverage确保高于90%。这样UI不用怎么测试,几乎不会有错,整个项目也做好了。&br&&br&当然并不是所有的老板都会让你这么干,也不是所有的人都有办法做到这一点。实际上行动起来总是要有各种妥协。说来这个90%的标准其实是我若干年前在Visual Studio实习的时候,老板要求的。我觉得很好。
如果条件允许的话,我都是尽量不写main函数,不做GUI,所有的代码都用unit test来运行。我也不喜欢做mock,需要数据库的话就写个SQL脚本让他可以在空的数据库上生成一些我要的单元测试的数据,然后我的程序就真的连接到这上面跑。需要C/S就把两个测试进程(…
&figure&&img src=&https://pic2.zhimg.com/v2-63edf1bfae141e9e9d3e7_b.jpg& data-rawwidth=&720& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic2.zhimg.com/v2-63edf1bfae141e9e9d3e7_r.jpg&&&/figure&知乎上总有一种声音:&br&&blockquote&如果你没读过CLRS/CSAPP/SICP,那么你的CS生涯是不圆满的。&/blockquote&注:&br&CLRS为《算法导论》(链接:&a href=&https://link.zhihu.com/?target=https%3A//book.douban.com/subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&算法导论(原书第3版) (豆瓣)&/a&);&br&CSAPP为《深入理解计算机系统》(链接:&a href=&https://link.zhihu.com/?target=https%3A//book.douban.com/subject/1230413/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解计算机系统 (豆瓣)&/a&);&br&SICP为为《计算机程序的构造和解释》(链接:&a href=&https://link.zhihu.com/?target=https%3A//book.douban.com/subject/1148282/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机程序的构造和解释 (豆瓣)&/a&)。&p&因为本人的兴趣点在安全+大数据方向,CSAPP和SICP实在抽不出时间拜读,只好看看CLRS了。&br&&br&算法与数据结构作为编程的基础,在CS中的重要性不言而喻。我老师曾经说过学计算机好比学武功,编程语言算招式,算法设计能力是内功。算法实乃高手决胜负之地。&br&&br&于是萌生了看算法导论的想法。&br&&br&&b&个人基础&/b&&br&本科课程学习过《数据结构》、《算法分析》、《人工智能》。&br&&br&&b&资料准备&/b&&br&网易公开课的算法导论(&a href=&https://link.zhihu.com/?target=http%3A//open.163.com/special/opencourse/algorithms.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&麻省理工学院公开课:算法导论_全23集_网易公开课&/a&):&br&该课程是由Charles Leiserson(CLRS作者之一)、Erik Demaine两人共同授课完成。Charles风格严谨而有逻辑,Erik风格形象生动。这应该是全网最优秀的教学资源了(某客的算法导论课程没上过,不作评价)。但是其中还是有些是遗漏的,譬如堆排序和B树等等是没有的。根据网友的推测,是在MIT的习题课上讲了,而那一部分是没有录像的,所以只能自己看书。还有一些是课程有提及,但书本没有的,譬如跳跃表以及高级课题等等。&br&&br&课本讲义(&a href=&https://link.zhihu.com/?target=https%3A//ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Introduction to Algorithms (SMA 5503)&/a&):&br&由于该课程录制的时候画质较低,所以全网都没有所谓的高清版本视频课程。所以看老师黑板板书部分一塌糊涂也也只能将就。但MIT课程主页是有讲义提供的(就是老师上课时候看的那份PPT)。几乎每一节都有讲义。讲义位置在VIDEO LECTURES→相应Lecture→视频下方的Related Resources→Lecture Notes(PDF)。在上相应课程时候可以打开来看,可以解决看不清楚板书的后排学生难题。&br&&br&算法导论教材(&a href=&https://link.zhihu.com/?target=https%3A//item.jd.com/.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&购买链接&/a&):&br&如果玩算法的人组成宗教的话,算法导论就是圣经。这本大部头肯定是必备的。&br&&br&&b&时间计划&/b&&br&本人在中学时代被GTD害得不浅。所谓的一天背10个单词,一年下来就背3650个了;一个月读三本书,一年下来整个人都博学了等等,都是Nonsense,这些鬼计划除了把人的时间碎片化以外不会给个人带来任何的收益。我个人信奉的生产力是Deadline。在Deadline面前,所有的矫情都会化作苍白。所以我个人的计划就是,尽量推掉所有无关的事情,专注于学习算导课程,并预计一个能完成的Deadline,并向着那个目标努力。所以说从17年第一天到现在,我除了吃饭睡觉外,全部时间都放在学习算法导论上面。其原则就是:只专注于一件事情,并尽可能做得漂亮(向乔布斯致敬)。&br&&br&&b&学习目的&/b&&br&了解算法导论梗概,并实现大部分算法。&br&豆瓣上有人把CLRS通读下来,把书本内容全部看完且看懂,用了二十个月。可见这本书绝对不是等闲之辈。所以我在最初时候目标就不是如链表般全部深读,而是如跳跃表般把重要的部分理解,然后跳过并不重要的部分。由于我是带着提高编码能力的初衷进行学习的,所以我跳过了推理证明部分,而把精力放到了理解伪代码/算法上面。这样学习起来不会如愚公移山一般艰难,而且能学到自己感兴趣的东西。&br&&br&&b&学习收获&/b&&br&大部分课程中提到的算法都实现了一遍,具体算法如下:&br&&/p&&ol&&li&插入排序;&/li&&li&归并排序;&/li&&li&二分查找;&/li&&li&快速阶乘;&/li&&li&斐波那契数列(包括原始算法、线性算法、递归矩阵算法);&/li&&li&Strassen算法;&/li&&li&堆排序;&/li&&li&基数排序;&/li&&li&中分查找;&/li&&li&链表哈希算法;&/li&&li&开放地址哈希算法;&/li&&li&随机化查找;&/li&&li&随机化快速排序;&/li&&li&二分查找树;&/li&&li&红黑树;&/li&&li&栈;&/li&&li&双向链表;&/li&&li&循环队列;&/li&&li&最长子字符串问题;&/li&&li&图的广度/深度优先搜索;&/li&&li&单源最短路径Dijkstra算法;&/li&&li&跳跃表。&/li&&/ol&Github地址:&a href=&https://link.zhihu.com/?target=https%3A//github.com/hating/IntroductionToAlgorithms& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/hating/Intro&/span&&span class=&invisible&&ductionToAlgorithms&/span&&span class=&ellipsis&&&/span&&/a&。&br&欢迎来Star。&br&&br&&b&下一步目标&/b&&br&算法是个很重要的东西。只要人还在计算机行业谋生,就需要继续学习算法。细心的读者可以发现我并没有实现B树和van Emde Boas树等等。这些都会陆陆续续放到Github上的。不过下次写关于算法的文章不知猴年马月,这个专栏还是多聊聊安全吧~
知乎上总有一种声音: 如果你没读过CLRS/CSAPP/SICP,那么你的CS生涯是不圆满的。注: CLRS为《算法导论》(链接:); CSAPP为《深入理解计算机系统》(链接:); SICP为为《计算机程序的构造和解…
利益相关:微软亚洲研究院实习生,研究方向是 FPGA 在数据中心的应用。&br&&br&问题「用 FPGA 代替 CPU」中,这个「代替」的说法不准确。我们并不是不用 CPU 了,而是&b&用 FPGA 加速适合它的计算任务,其他任务仍然在 CPU 上完成,让 FPGA 和 CPU 协同工作&/b&。&br&&br&本回答将涵盖三个问题:&br&&ol&&li&为什么使用 FPGA,相比 CPU、GPU、ASIC(专用芯片)有什么特点?&/li&&li&微软的 FPGA 部署在哪里?FPGA 之间、FPGA 与 CPU 之间是如何通信的?&/li&&li&未来 FPGA 在云计算平台中应充当怎样的角色?仅仅是像 GPU 一样的计算加速卡吗?&/li&&/ol&&br&&b&一、为什么使用 FPGA?&/b&&br&&br&众所周知,通用处理器(CPU)的摩尔定律已入暮年,而机器学习和 Web 服务的规模却在指数级增长。&b&人们使用定制硬件来加速常见的计算任务,然而日新月异的行业又要求这些定制的硬件可被重新编程来执行新类型的计算任务&/b&。FPGA (Field Programmable Gate Array) 正是一种硬件可重构的体系结构,常年来被用作专用芯片(ASIC)的小批量替代品,然而近年来在微软、百度等公司的数据中心大规模部署,以&b&同时提供强大的计算能力和足够的灵活性&/b&。&br&&br&&figure&&img src=&https://pic3.zhimg.com/50/v2-71bb2dab64eb85e80b815c_b.jpg& data-rawwidth=&2106& data-rawheight=&1147& class=&origin_image zh-lightbox-thumb& width=&2106& data-original=&https://pic3.zhimg.com/50/v2-71bb2dab64eb85e80b815c_r.jpg&&&/figure&&i&不同体系结构性能和灵活性的比较。&/i&&br&&br&FPGA 为什么快?「都是同行衬托得好」。&b&CPU、GPU 都属于冯·诺依曼结构,指令译码执行、共享内存。&/b&FPGA 之所以比 CPU 甚至 GPU 能效高,本质上是无指令、无需共享内存的体系结构带来的福利。&br&&br&冯氏结构中,由于执行单元(如 CPU 核)可能执行任意指令,就需要有指令存储器、译码器、各种指令的运算器、分支跳转处理逻辑。由于指令流的控制逻辑复杂,不可能有太多条独立的指令流,因此 GPU 使用 SIMD(单指令流多数据流)来让多个执行单元以同样的步调处理不同的数据,CPU 也支持 SIMD 指令。而 &b&FPGA 每个逻辑单元的功能在重编程(烧写)时就已经确定,不需要指令。&/b&&br&&br&冯氏结构中使用内存有两种作用。一是保存状态,二是在执行单元间通信。由于内存是共享的,就需要做访问仲裁;为了利用访问局部性,每个执行单元有一个私有的缓存,这就要维持执行部件间缓存的一致性。&b&对于保存状态的需求,&/b&&b&FPGA&/b& 中的寄存器和片上内存(BRAM)是属于各自的控制逻辑的,&b&无需不必要的仲裁和缓存&/b&。&b&对于通信的需求,FPGA&/b& 每个逻辑单元与周围逻辑单元的连接在重编程(烧写)时就已经确定,&b&并不需要通过共享内存来通信&/b&。&br&&br&说了这么多三千英尺高度的话,FPGA 实际的表现如何呢?我们分别来看计算密集型任务和通信密集型任务。&br&&br&&b&计算密集型任务&/b&的例子包括矩阵运算、图像处理、机器学习、压缩、非对称加密、Bing 搜索的排序等。这类任务一般是 CPU 把任务卸载(offload)给 FPGA 去执行。对这类任务,目前我们正在用的 Altera(似乎应该叫 Intel 了,我还是习惯叫 Altera……)Stratix V FPGA 的整数乘法运算性能与 20 核的 CPU 基本相当,浮点乘法运算性能与 8 核的 CPU 基本相当,而比 GPU 低一个数量级。我们即将用上的下一代 FPGA,Stratix 10,将配备更多的乘法器和硬件浮点运算部件,从而理论上可达到与现在的顶级 GPU 计算卡旗鼓相当的计算能力。&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-ff703e9c57f9cf55777b_b.jpg& data-rawwidth=&1053& data-rawheight=&832& class=&origin_image zh-lightbox-thumb& width=&1053& data-original=&https://pic4.zhimg.com/50/v2-ff703e9c57f9cf55777b_r.jpg&&&/figure&&i&FPGA 的整数乘法运算能力(&/i&&i&估计值,&/i&&i&不使用 DSP,根据逻辑资源占用量估计)&/i&&br&&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-404dcbcf292c4e31b3e12ebc228963af_b.jpg& data-rawwidth=&1070& data-rawheight=&831& class=&origin_image zh-lightbox-thumb& width=&1070& data-original=&https://pic2.zhimg.com/50/v2-404dcbcf292c4e31b3e12ebc228963af_r.jpg&&&/figure&&i&FPGA 的浮点乘法运算能力(估计值,float16 用软核,float 32 用硬核)&/i&&br&&br&&b&在数据中心,FPGA 相比 GPU 的核心优势在于延迟&/b&。像 Bing 搜索排序这样的任务,要尽可能快地返回搜索结果,就需要尽可能降低每一步的延迟。如果使用 GPU 来加速,要想充分利用 GPU 的计算能力,batch size 就不能太小,延迟将高达毫秒量级。使用 FPGA 来加速的话,只需要微秒级的 PCIe 延迟(我们现在的 FPGA 是作为一块 PCIe 加速卡)。未来 Intel 推出通过 QPI 连接的 Xeon + FPGA 之后,CPU 和 FPGA 之间的延迟更可以降到 100 纳秒以下,跟访问主存没什么区别了。&br&&br&FPGA 为什么比 GPU 的延迟低这么多?这本质上是体系结构的区别。&b&FPGA 同时拥有流水线并行和数据并行,而 GPU 几乎只有数据并行(流水线深度受限)。&/b&例如处理一个数据包有 10 个步骤,FPGA 可以搭建一个 10 级流水线,流水线的不同级在处理不同的数据包,每个数据包流经 10 级之后处理完成。每处理完成一个数据包,就能马上输出。而 GPU 的数据并行方法是做 10 个计算单元,每个计算单元也在处理不同的数据包,然而所有的计算单元必须按照统一的步调,做相同的事情(SIMD,Single Instruction Multiple Data)。这就要求 10 个数据包必须一起输入、一起输出,输入输出的延迟增加了。当任务是逐个而非成批到达的时候,流水线并行比数据并行可实现更低的延迟。因此&b&对流式计算的任务,FPGA 比 GPU 天生有延迟方面的优势。&/b&&br&&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-1ffb204e56f3d02b0cabdcd6f6c3fb34_b.jpg& data-rawwidth=&1435& data-rawheight=&476& class=&origin_image zh-lightbox-thumb& width=&1435& data-original=&https://pic2.zhimg.com/50/v2-1ffb204e56f3d02b0cabdcd6f6c3fb34_r.jpg&&&/figure&&i&计算密集型任务,CPU、GPU、FPGA、ASIC 的数量级比较(以 16 位整数乘法为例,数字仅为数量级的估计)&/i&&br&&br&ASIC 专用芯片在吞吐量、延迟和功耗三方面都无可指摘,但微软并没有采用,出于两个原因:&br&&ol&&li&数据中心的计算任务是灵活多变的,而 ASIC 研发成本高、周期长。好不容易大规模部署了一批某种神经网络的加速卡,结果另一种神经网络更火了,钱就白费了。FPGA 只需要几百毫秒就可以更新逻辑功能。&b&FPGA 的灵活性可以保护投资,事实上,微软现在的 FPGA 玩法与最初的设想大不相同。&/b&&/li&&li&数据中心是租给不同的租户使用的,如果有的机器上有神经网络加速卡,有的机器上有 Bing 搜索加速卡,有的机器上有网络虚拟化加速卡,任务的调度和服务器的运维会很麻烦。&b&使用 FPGA 可以保持数据中心的同构性。&/b&&/li&&/ol&&br&接下来看通信密集型任务。相比计算密集型任务,通信密集型任务对每个输入数据的处理不甚复杂,基本上简单算算就输出了,这时通信往往会成为瓶颈。对称加密、防火墙、网络虚拟化都是通信密集型的例子。&br&&br&&figure&&img src=&https://pic1.zhimg.com/50/v2-d74634adc21db32f6fafed538c7b91ca_b.jpg& data-rawwidth=&1434& data-rawheight=&478& class=&origin_image zh-lightbox-thumb& width=&1434& data-original=&https://pic1.zhimg.com/50/v2-d74634adc21db32f6fafed538c7b91ca_r.jpg&&&/figure&&i&通信密集型任务,CPU、GPU、FPGA、ASIC 的数量级比较(以 64 字节网络数据包处理为例,&/i&&i&数字仅为数量级的估计&/i&&i&)&/i&&br&&br&&b&对通信密集型任务,FPGA 相比 CPU、GPU 的优势就更大了&/b&。从吞吐量上讲,FPGA 上的收发器可以直接接上 40 Gbps 甚至 100 Gbps 的网线,以线速处理任意大小的数据包;而 CPU 需要从网卡把数据包收上来才能处理,&b&很多网卡是不能线速处理 64 字节的小数据包的&/b&。尽管可以通过插多块网卡来达到高性能,但 CPU 和主板支持的 PCIe 插槽数量往往有限,而且网卡、交换机本身也价格不菲。&br&&br&从延迟上讲,网卡把数据包收到 CPU,CPU 再发给网卡,即使使用 DPDK 这样高性能的数据包处理框架,延迟也有 4~5 微秒。更严重的问题是,&b&通用 CPU 的延迟不够稳定&/b&。例如当负载较高时,转发延迟可能升到几十微秒甚至更高(如下图所示);现代操作系统中的时钟中断和任务调度也增加了延迟的不确定性。&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-b5b50a3c73cba5223ada6c6_b.jpg& data-rawwidth=&817& data-rawheight=&594& class=&origin_image zh-lightbox-thumb& width=&817& data-original=&https://pic2.zhimg.com/50/v2-b5b50a3c73cba5223ada6c6_r.jpg&&&/figure&&i&ClickNP(FPGA)与 Dell S6000 交换机(商用交换机芯片)、Click+DPDK(CPU)和 Linux(CPU)的转发延迟比较,error bar 表示 5% 和 95%。来源:[5]&/i&&br&&br&虽然 GPU 也可以高性能处理数据包,但 GPU 是没有网口的,意味着需要首先把数据包由网卡收上来,再让 GPU 去做处理。这样吞吐量受到 CPU 和/或网卡的限制。GPU 本身的延迟就更不必说了。&br&&br&那么为什么不把这些网络功能做进网卡,或者使用可编程交换机呢?&b&ASIC 的灵活性仍然是硬伤&/b&。尽管目前有越来越强大的可编程交换机芯片,比如支持 P4 语言的 Tofino,ASIC 仍然不能做复杂的有状态处理,比如某种自定义的加密算法。&br&&br&综上,&b&在数据中心里 FPGA 的主要优势是稳定又极低的延迟,适用于流式的计算密集型任务和通信密集型任务。&/b&&br&&br&&br&&b&二、微软部署 FPGA 的实践&/b&&br&&br&2016 年 9 月,《连线》(&i&Wired&/i&)杂志发表了一篇《微软把未来押注在 FPGA 上》的报道 [3],讲述了 Catapult 项目的前世今生。紧接着,Catapult 项目的老大 Doug Burger 在 Ignite 2016 大会上与微软 CEO Satya Nadella 一起做了 FPGA 加速机器翻译的演示。演示的总计算能力是 103 万 T ops,也就是 1.03 Exa-op,相当于 10 万块顶级 GPU 计算卡。一块 FPGA(加上板上内存和网络接口等)的功耗大约是 30 W,仅增加了整个服务器功耗的十分之一。&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-de52eeb2acae767ec3a3_b.jpg& data-rawwidth=&1410& data-rawheight=&731& class=&origin_image zh-lightbox-thumb& width=&1410& data-original=&https://pic4.zhimg.com/50/v2-de52eeb2acae767ec3a3_r.jpg&&&/figure&&i&Ignite 2016 上的演示:每秒 1 Exa-op (10^18) 的机器翻译运算能力&/i&&br&&br&微软部署 FPGA 并不是一帆风顺的。&b&对于把 FPGA 部署在哪里这个问题,大致经历了三个阶段:&/b&&br&&ol&&li&&b&专用的 FPGA 集群,里面插满了 FPGA&/b&&/li&&li&&b&每台机器一块 FPGA,采用专用网络连接&/b&&/li&&li&&b&每台机器一块 FPGA,放在网卡和交换机之间,共享服务器网络&/b&&/li&&/ol&&figure&&img src=&https://pic3.zhimg.com/50/v2-880465ced11d754f07f8edd225e48cab_b.jpg& data-rawwidth=&1077& data-rawheight=&1335& class=&origin_image zh-lightbox-thumb& width=&1077& data-original=&https://pic3.zhimg.com/50/v2-880465ced11d754f07f8edd225e48cab_r.jpg&&&/figure&&i&微软 FPGA 部署方式的三个阶段,来源:[3]&/i&&br&&br&第一个阶段是专用集群,里面插满了 FPGA 加速卡,就像是一个 FPGA 组成的超级计算机。下图是最早的 BFB 实验板,一块 PCIe 卡上放了 6 块 FPGA,每台 1U 服务器上又插了 4 块 PCIe 卡。&br&&br&&figure&&img src=&https://pic1.zhimg.com/50/v2-8edb5cfe1cf_b.jpg& data-rawwidth=&2483& data-rawheight=&1101& class=&origin_image zh-lightbox-thumb& width=&2483& data-original=&https://pic1.zhimg.com/50/v2-8edb5cfe1cf_r.jpg&&&/figure&&i&最早的 BFB 实验板,上面放了 6 块 FPGA。来源:[1]&/i&&br&&br&可以注意到该公司的名字。在半导体行业,只要批量足够大,芯片的价格都将趋向于沙子的价格。据传闻,正是由于该公司不肯给「沙子的价格」 ,才选择了另一家公司。当然现在数据中心领域用两家公司 FPGA 的都有。&b&只要规模足够大,对 FPGA 价格过高的担心将是不必要的。&/b&&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-aa8f6a91bfa87bd5db9165_b.jpg& data-rawwidth=&714& data-rawheight=&599& class=&origin_image zh-lightbox-thumb& width=&714& data-original=&https://pic4.zhimg.com/50/v2-aa8f6a91bfa87bd5db9165_r.jpg&&&/figure&&i&最早的 BFB 实验板,1U 服务器上插了 4 块 FPGA 卡。来源:[1]&/i&&br&&br&像超级计算机一样的部署方式,意味着有专门的一个机柜全是上图这种装了 24 块 FPGA 的服务器(下图左)。这种方式有几个问题:&br&&ol&&li&不同机器的 FPGA 之间无法通信,FPGA 所能处理问题的规模受限于单台服务器上 FPGA 的数量;&/li&&li&数据中心里的其他机器要把任务集中发到这个机柜,构成了 in-cast,网络延迟很难做到稳定。&/li&&li&FPGA 专用机柜构成了单点故障,只要它一坏,谁都别想加速了;&/li&&li&装 FPGA 的服务器是定制的,冷却、运维都增加了麻烦。&/li&&/ol&&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-70aa39ffd70ec_b.jpg& data-rawwidth=&2534& data-rawheight=&1206& class=&origin_image zh-lightbox-thumb& width=&2534& data-original=&https://pic2.zhimg.com/50/v2-70aa39ffd70ec_r.jpg&&&/figure&&i&部署 FPGA 的三种方式,从中心化到分布式。来源:[1]&/i&&br&&br&一种不那么激进的方式是,在每个机柜一面部署一台装满 FPGA 的服务器(上图中)。这避免了上述问题 (2)(3),但 (1)(4) 仍然没有解决。&br&&br&第二个阶段,为了&b&保证数据中心中服务器的同构性&/b&(这也是不用 ASIC 的一个重要原因),在每台服务器上插一块 FPGA(上图右),FPGA 之间通过专用网络连接。这也是微软在 ISCA'14 上所发表论文采用的部署方式。&br&&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-7b73facc9e24d0fceca7e_b.jpg& data-rawwidth=&858& data-rawheight=&612& class=&origin_image zh-lightbox-thumb& width=&858& data-original=&https://pic2.zhimg.com/50/v2-7b73facc9e24d0fceca7e_r.jpg&&&/figure&&i&Open Compute Server 在机架中。来源:[1]&/i&&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-e23b8d5c807ad2fffbec_b.jpg& data-rawwidth=&2433& data-rawheight=&736& class=&origin_image zh-lightbox-thumb& width=&2433& data-original=&https://pic4.zhimg.com/50/v2-e23b8d5c807ad2fffbec_r.jpg&&&/figure&&i&Open Compute Server 内景。红框是放 FPGA 的位置。来源:[1]&/i&&br&&br&&figure&&img src=&https://pic1.zhimg.com/50/v2-f0ca82beaa1389406ebbc15_b.jpg& data-rawwidth=&1034& data-rawheight=&594& class=&origin_image zh-lightbox-thumb& width=&1034& data-original=&https://pic1.zhimg.com/50/v2-f0ca82beaa1389406ebbc15_r.jpg&&&/figure&&i&插入 FPGA 后的 Open Compute Server。来源:[1]&/i&&br&&br&&figure&&img src=&https://pic3.zhimg.com/50/v2-6d0fdf2e59d9a4b579fc59c_b.jpg& data-rawwidth=&1002& data-rawheight=&1353& class=&origin_image zh-lightbox-thumb& width=&1002& data-original=&https://pic3.zhimg.com/50/v2-6d0fdf2e59d9a4b579fc59c_r.jpg&&&/figure&&i&FPGA 与 Open Compute Server 之间的连接与固定。来源:[1]&/i&&br&&br&FPGA 采用 Stratix V D5,有 172K 个 ALM,2014 个 M20K 片上内存,1590 个 DSP。板上有一个 8GB DDR3-1333 内存,一个 PCIe Gen3 x8 接口,两个 10 Gbps 网络接口。一个机柜之间的 FPGA 采用专用网络连接,一组 10G 网口 8 个一组连成环,另一组 10G 网口 6 个一组连成环,不使用交换机。&br&&br&&figure&&img src=&https://pic1.zhimg.com/50/v2-a932a3ac4cd8_b.jpg& data-rawwidth=&2431& data-rawheight=&1218& class=&origin_image zh-lightbox-thumb& width=&2431& data-original=&https://pic1.zhimg.com/50/v2-a932a3ac4cd8_r.jpg&&&/figure&&i&机柜中 FPGA 之间的网络连接方式。来源:[1]&/i&&br&&br&这样一个 1632 台服务器、1632 块 FPGA 的集群,把 Bing 的搜索结果排序整体性能提高到了 2 倍(换言之,节省了一半的服务器)。如下图所示,每 8 块 FPGA 穿成一条链,中间用前面提到的 10 Gbps 专用网线来通信。这 8 块 FPGA 各司其职,有的负责从文档中提取特征(黄色),有的负责计算特征表达式(绿色),有的负责计算文档的得分(红色)。&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-aaef099e0f6cf7aaf9e5be6bb3b0bc27_b.jpg& data-rawwidth=&1655& data-rawheight=&1155& class=&origin_image zh-lightbox-thumb& width=&1655& data-original=&https://pic4.zhimg.com/50/v2-aaef099e0f6cf7aaf9e5be6bb3b0bc27_r.jpg&&&/figure&&i&FPGA 加速 Bing 的搜索排序过程。来源:[1]&/i&&br&&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-8bd4abed27f2cbb8605f_b.jpg& data-rawwidth=&963& data-rawheight=&638& class=&origin_image zh-lightbox-thumb& width=&963& data-original=&https://pic2.zhimg.com/50/v2-8bd4abed27f2cbb8605f_r.jpg&&&/figure&&i&FPGA 不仅降低了 Bing 搜索的延迟,还显著提高了延迟的稳定性。来源:[4]&/i&&br&&br&&figure&&img src=&https://pic3.zhimg.com/50/v2-bb29f3d4b687ce294b329c_b.jpg& data-rawwidth=&963& data-rawheight=&647& class=&origin_image zh-lightbox-thumb& width=&963& data-original=&https://pic3.zhimg.com/50/v2-bb29f3d4b687ce294b329c_r.jpg&&&/figure&&br&&i&本地和远程的 FPGA 均可以降低搜索延迟,远程 FPGA 的通信延迟相比搜索延迟可忽略。&/i&&i&来源:[4]&/i&&br&&br&FPGA 在 Bing 的部署取得了成功,Catapult 项目继续在公司内扩张。微软内部拥有最多服务器的,就是云计算 Azure 部门了。Azure 部门急需解决的问题是网络和存储虚拟化带来的开销。Azure 把虚拟机卖给客户,需要给虚拟机的网络提供防火墙、负载均衡、隧道、NAT 等网络功能。由于云存储的物理存储跟计算节点是分离的,需要把数据从存储节点通过网络搬运过来,还要进行压缩和加密。&br&&br&在 1 Gbps 网络和机械硬盘的时代,网络和存储虚拟化的 CPU 开销不值一提。随着网络和存储速度越来越快,网络上了 40 Gbps,一块 SSD 的吞吐量也能到 1 GB/s,CPU 渐渐变得力不从心了。例如 Hyper-V 虚拟交换机只能处理 25 Gbps 左右的流量,不能达到 40 Gbps 线速,当数据包较小时性能更差;AES-256 加密和 SHA-1 签名,每个 CPU 核只能处理 100 MB/s,只是一块 SSD 吞吐量的十分之一。&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-5aeb1ccedd0b0f00cd82_b.jpg& data-rawwidth=&1842& data-rawheight=&546& class=&origin_image zh-lightbox-thumb& width=&1842& data-original=&https://pic2.zhimg.com/50/v2-5aeb1ccedd0b0f00cd82_r.jpg&&&/figure&&i&网络隧道协议、防火墙处理 40 Gbps 需要的 CPU 核数。来源:[5]&/i&&br&&br&&b&为了加速网络功能和存储虚拟化,微软把 FPGA 部署在网卡和交换机之间。&/b&如下图所示,每个 FPGA 有一个 4 GB DDR3-1333 DRAM,通过两个 PCIe Gen3 x8 接口连接到一个 CPU socket(物理上是 PCIe Gen3 x16 接口,因为 FPGA 没有 x16 的硬核,逻辑上当成两个 x8 的用)。物理网卡(NIC)就是普通的 40 Gbps 网卡,仅用于宿主机与网络之间的通信。&br&&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-974dfbd7fc14f_b.jpg& data-rawwidth=&1265& data-rawheight=&625& class=&origin_image zh-lightbox-thumb& width=&1265& data-original=&https://pic2.zhimg.com/50/v2-974dfbd7fc14f_r.jpg&&&/figure&&i&Azure 服务器部署 FPGA 的架构。来源:[6]&/i&&br&&br&FPGA(SmartNIC)对每个虚拟机虚拟出一块网卡,虚拟机通过 SR-IOV 直接访问这块虚拟网卡。原本在虚拟交换机里面的数据平面功能被移到了 FPGA 里面,虚拟机收发网络数据包均不需要 CPU 参与,也不需要经过物理网卡(NIC)。这样不仅节约了可用于出售的 CPU 资源,还&b&提高了虚拟机的网络性能(25 Gbps),把同数据中心虚拟机之间的网络延迟降低了 10 倍&/b&。&br&&br&&figure&&img src=&https://pic3.zhimg.com/50/v2-dad5b8d8d6ac0e047a016924_b.jpg& data-rawwidth=&2371& data-rawheight=&1316& class=&origin_image zh-lightbox-thumb& width=&2371& data-original=&https://pic3.zhimg.com/50/v2-dad5b8d8d6ac0e047a016924_r.jpg&&&/figure&&i&网络虚拟化的加速架构。来源:[6]&/i&&br&&br&这就是微软部署 FPGA 的第三代架构,也是目前「每台服务器一块 FPGA」大规模部署所采用的架构。&b&FPGA 复用主机网络的初心是加速网络和存储,更深远的影响则是把 FPGA 之间的网络连接扩展到了整个数据中心的规模&/b&,做成真正 cloud-scale 的「超级计算机」。第二代架构里面,FPGA 之间的网络连接局限于同一个机架以内,FPGA 之间专网互联的方式很难扩大规模,通过 CPU 来转发则开销太高。&br&&br&第三代架构中,FPGA 之间通过 LTL (Lightweight Transport Layer) 通信。同一机架内延迟在 3 微秒以内;8 微秒以内可达 1000 块 FPGA;20 微秒可达同一数据中心的所有 FPGA。第二代架构尽管 8 台机器以内的延迟更低,但只能通过网络访问 48 块 FPGA。为了支持大范围的 FPGA 间通信,第三代架构中的 LTL 还支持 PFC 流控协议和 DCQCN 拥塞控制协议。&br&&br&&figure&&img src=&https://pic1.zhimg.com/50/v2-c1dbeccbb5_b.jpg& data-rawwidth=&2209& data-rawheight=&993& class=&origin_image zh-lightbox-thumb& width=&2209& data-original=&https://pic1.zhimg.com/50/v2-c1dbeccbb5_r.jpg&&&/figure&&i&纵轴:LTL 的延迟,横轴:可达的 FPGA 数量。来源:[4]&/i&&br&&br&&figure&&img src=&https://pic3.zhimg.com/50/v2-7ce4e13c6a60fe7923ceb_b.jpg& data-rawwidth=&968& data-rawheight=&791& class=&origin_image zh-lightbox-thumb& width=&968& data-original=&https://pic3.zhimg.com/50/v2-7ce4e13c6a60fe7923ceb_r.jpg&&&/figure&&i&FPGA 内的逻辑模块关系,其中每个 Role 是用户逻辑(如 DNN 加速、网络功能加速、加密),外面的部分负责各个 Role 之间的通信及 Role 与外设之间的通信。来源:[4]&/i&&br&&br&&figure&&img src=&https://pic1.zhimg.com/50/v2-b9d7f53b5125aecfd5d0b719b1a4179f_b.jpg& data-rawwidth=&1272& data-rawheight=&971& class=&origin_image zh-lightbox-thumb& width=&1272& data-original=&https://pic1.zhimg.com/50/v2-b9d7f53b5125aecfd5d0b719b1a4179f_r.jpg&&&/figure&&i&FPGA 构成的数据中心加速平面,介于网络交换层(TOR、L1、L2)和传统服务器软件(CPU 上运行的软件)之间。来源:[4]&/i&&br&&br&&b&通过高带宽、低延迟的网络互联的 FPGA 构成了介于网络交换层和传统服务器软件之间的数据中心加速平面。&/b&除了每台提供云服务的服务器都需要的网络和存储虚拟化加速,FPGA 上的剩余资源还可以用来加速 Bing 搜索、深度神经网络(DNN)等计算任务。&br&&br&&b&对很多类型的应用,随着分布式 FPGA 加速器的规模扩大,其性能提升是超线性的。&/b&例如 CNN inference,当只用一块 FPGA 的时候,由于片上内存不足以放下整个模型,需要不断访问 DRAM 中的模型权重,性能瓶颈在 DRAM;如果 FPGA 的数量足够多,每块 FPGA 负责模型中的一层或者一层中的若干个特征,使得模型权重完全载入片上内存,就消除了 DRAM 的性能瓶颈,完全发挥出 FPGA 计算单元的性能。当然,拆得过细也会导致通信开销的增加。&b&把任务拆分到分布式 FPGA 集群的关键在于平衡计算和通信。&/b&&br&&br&&figure&&img src=&https://pic1.zhimg.com/50/v2-5a17afc6d68df612e27e2_b.jpg& data-rawwidth=&1827& data-rawheight=&394& class=&origin_image zh-lightbox-thumb& width=&1827& data-original=&https://pic1.zhimg.com/50/v2-5a17afc6d68df612e27e2_r.jpg&&&/figure&&i&从神经网络模型到 HaaS 上的 FPGA。利用模型内的并行性,模型的不同层、不同特征映射到不同 FPGA。来源:[4]&/i&&br&&br&在 MICRO'16 会议上,微软提出了 &b&Hardware as a Service (HaaS)&/b& 的概念,即把硬件作为一种可调度的云服务,使得 FPGA 服务的集中调度、管理和大规模部署成为可能。&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-e87fddf2b776f27c0d37cba5a521beed_b.jpg& data-rawwidth=&1025& data-rawheight=&950& class=&origin_image zh-lightbox-thumb& width=&1025& data-original=&https://pic4.zhimg.com/50/v2-e87fddf2b776f27c0d37cba5a521beed_r.jpg&&&/figure&&i&Hardware as a Service (HaaS)。来源:[4]&/i&&br&&br&从第一代装满 FPGA 的专用服务器集群,到第二代通过专网连接的 FPGA 加速卡集群,到目前复用数据中心网络的大规模 FPGA 云,三个思想指导我们的路线:&br&&ol&&li&&b&硬件和软件不是相互取代的关系,而是合作的关系;&/b&&/li&&li&&b&必须具备灵活性,即用软件定义的能力;&/b&&/li&&li&&b&必须具备可扩放性(scalability)。&/b&&/li&&/ol&&br&&br&&b&三、FPGA 在云计算中的角色&br&&/b&&br&最后谈一点我个人对 FPGA 在云计算中角色的思考。作为三年级博士生,我在微软亚洲研究院的研究试图回答两个问题:&br&&ol&&li&FPGA 在云规模的网络互连系统中应当充当怎样的角色?&/li&&li&如何高效、可扩放地对 FPGA + CPU 的异构系统进行编程?&/li&&/ol&&br&我对 FPGA 业界主要的遗憾是,FPGA 在数据中心的主流用法,从除微软外的互联网巨头,到两大 FPGA 厂商,再到学术界,大多是把 FPGA 当作跟 GPU 一样的计算密集型任务的加速卡。然而 FPGA 真的很适合做 GPU 的事情吗?前面讲过,&b&FPGA 和 GPU 最大的区别在于体系结构,FPGA 更适合做需要低延迟的流式处理,GPU 更适合做大批量同构数据的处理。&/b&&br&&br&由于很多人打算把 FPGA 当作计算加速卡来用,两大 FPGA 厂商推出的高层次编程模型也是基于 OpenCL,模仿 GPU 基于共享内存的批处理模式。CPU 要交给 FPGA 做一件事,需要先放进 FPGA 板上的 DRAM,然后告诉 FPGA 开始执行,FPGA 把执行结果放回 DRAM,再通知 CPU 去取回。&b&CPU 和 FPGA 之间本来可以通过 PCIe 高效通信,为什么要到板上的 DRAM 绕一圈?&/b&也许是工程实现的问题,我们发现通过 OpenCL 写 DRAM、启动 kernel、读 DRAM 一个来回,需要 1.8 毫秒。而通过 PCIe DMA 来通信,却只要 1~2 微秒。&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-ade077e9ffe5e9babeb857_b.jpg& data-rawwidth=&1761& data-rawheight=&647& class=&origin_image zh-lightbox-thumb& width=&1761& data-original=&https://pic4.zhimg.com/50/v2-ade077e9ffe5e9babeb857_r.jpg&&&/figure&&i&PCIe I/O channel 与 OpenCL 的性能比较。纵坐标为对数坐标。来源:[5]&/i&&br&&br&OpenCL 里面多个 kernel 之间的通信就更夸张了,默认的方式也是通过共享内存。本文开篇就讲,FPGA 比 CPU 和 GPU 能效高,体系结构上的根本优势是无指令、无需共享内存。使用共享内存在多个 kernel 之间通信,在顺序通信(FIFO)的情况下是毫无必要的。况且 FPGA 上的 DRAM 一般比 GPU 上的 DRAM 慢很多。&br&&br&因此我们提出了 ClickNP 网络编程框架 [5],&b&使用管道(channel)而非共享内存来在执行单元(element/kernel)间、执行单元和主机软件间进行通信&/b&。需要共享内存的应用,也可以在管道的基础上实现,毕竟 CSP(Communicating Sequential Process)和共享内存理论上是等价的嘛。ClickNP 目前还是在 OpenCL 基础上的一个框架,受到 C 语言描述硬件的局限性(当然 HLS 比 Verilog 的开发效率确实高多了)。理想的硬件描述语言,大概不会是 C 语言吧。&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-f0af9adc093_b.jpg& data-rawwidth=&1647& data-rawheight=&618& class=&origin_image zh-lightbox-thumb& width=&1647& data-original=&https://pic4.zhimg.com/50/v2-f0af9adc093_r.jpg&&&/figure&&i&ClickNP 使用 channel 在 elements 间通信,来源:[5]&/i&&br&&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-e6ca6cdab83c_b.jpg& data-rawwidth=&1585& data-rawheight=&359& class=&origin_image zh-lightbox-thumb& width=&1585& data-original=&https://pic2.zhimg.com/50/v2-e6ca6cdab83c_r.jpg&&&/figure&&i&ClickNP 使用 channel 在 FPGA 和 CPU 间通信,来源:[5]&/i&&br&&br&低延迟的流式处理,需要最多的地方就是通信。然而 &b&CPU 由于并行性的限制和操作系统的调度,做通信效率不高,延迟也不稳定&/b&。此外,&b&通信就必然涉及到调度和仲裁&/b&,CPU 由于单核性能的局限和核间通信的低效,调度、仲裁性能受限,硬件则很适合做这种重复工作。因此我的博士研究把 FPGA 定义为通信的「大管家」,不管是服务器跟服务器之间的通信,虚拟机跟虚拟机之间的通信,进程跟进程之间的通信,CPU 跟存储设备之间的通信,都可以用 FPGA 来加速。&br&&br&成也萧何,败也萧何。缺少指令同时是 FPGA 的优势和软肋。每做一点不同的事情,就要占用一定的 FPGA 逻辑资源。如果要做的事情复杂、重复性不强,就会占用大量的逻辑资源,其中的大部分处于闲置状态。这时就不如用冯·诺依曼结构的处理器。数据中心里的很多任务有很强的局部性和重复性:&b&一部分是虚拟化平台需要做的网络和存储,这些都属于通信;另一部分是客户计算任务里的,比如机器学习、加密解密&/b&。我们首先把 FPGA 用于它最擅长的通信,日后也许也会像 AWS 那样把 FPGA 作为计算加速卡租给客户。&br&&br&不管通信还是机器学习、加密解密,算法都是很复杂的,如果试图用 FPGA 完全取代 CPU,势必会带来 FPGA 逻辑资源极大的浪费,也会提高 FPGA 程序的开发成本。更实用的做法是 &b&FPGA 和 CPU 协同工作,局部性和重复性强的归 FPGA,复杂的归 CPU。&/b&&br&&br&当我们用 FPGA 加速了 Bing 搜索、深度学习等越来越多的服务;当网络虚拟化、存储虚拟化等基础组件的数据平面被 FPGA 把持;当 FPGA 组成的「数据中心加速平面」成为网络和服务器之间的天堑……似乎有种感觉,FPGA 将掌控全局,CPU 上的计算任务反而变得碎片化,受 FPGA 的驱使。以往我们是 CPU 为主,把重复的计算任务卸载(offload)到 FPGA 上;以后会不会变成 FPGA 为主,把复杂的计算任务卸载到 CPU 上呢?随着 Xeon + FPGA 的问世,古老的 SoC 会不会在数据中心焕发新生?&br&&br&「跨越内存墙,走向可编程世界」&i&(&/i&&i&Across the memory wall and reach a fully programmable world.&/i&)&br&&br&&b&参考文献:&/b&&br&[1] Large-Scale Reconfigurable Computing in a Microsoft Datacenter &a href=&//link.zhihu.com/?target=https%3A//www.microsoft.com/en-us/research/wp-content/uploads/2014/06/HC26.12.520-Recon-Fabric-Pulnam-Microsoft-Catapult.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&microsoft.com/en-us/res&/span&&span class=&invisible&&earch/wp-content/uploads/2014/06/HC26.12.520-Recon-Fabric-Pulnam-Microsoft-Catapult.pdf&/span&&span class=&ellipsis&&&/span&&/a&&br&[2] A Reconfigurable Fabric for Accelerating Large-Scale Datacenter Services, ISCA'14 &a href=&//link.zhihu.com/?target=https%3A//www.microsoft.com/en-us/research/wp-content/uploads/2016/02/Catapult_ISCA_2014.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&microsoft.com/en-us/res&/span&&span class=&invisible&&earch/wp-content/uploads/2016/02/Catapult_ISCA_2014.pdf&/span&&span class=&ellipsis&&&/span&&/a&&br&[3] &a href=&//link.zhihu.com/?target=https%3A//www.wired.com/2016/09/microsoft-bets-future-chip-reprogram-fly/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Microsoft Has a Whole New Kind of Computer Chip—and It’ll Change Everything&/a&&br&[4] A Cloud-Scale Acceleration Architecture, MICRO'16 &a href=&//link.zhihu.com/?target=https%3A//www.microsoft.com/en-us/research/wp-content/uploads/2016/10/Cloud-Scale-Acceleration-Architecture.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&microsoft.com/en-us/res&/span&&span class=&invisible&&earch/wp-content/uploads/2016/10/Cloud-Scale-Acceleration-Architecture.pdf&/span&&span class=&ellipsis&&&/span&&/a&&br&[5] &a href=&//link.zhihu.com/?target=https%3A//www.microsoft.com/en-us/research/publication/clicknp-highly-flexible-high-performance-network-processing-reconfigurable-hardware/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ClickNP: Highly Flexible and High-performance Network Processing with Reconfigurable Hardware - Microsoft Research&/a&&br&[6] Daniel Firestone, SmartNIC: Accelerating Azure's Network with. FPGAs on OCS servers.
利益相关:微软亚洲研究院实习生,研究方向是 FPGA 在数据中心的应用。 问题「用 FPGA 代替 CPU」中,这个「代替」的说法不准确。我们并不是不用 CPU 了,而是用 FPGA 加速适合它的计算任务,其他任务仍然在 CPU 上完成,让 FPGA 和 CPU 协同工作。 本回答…
当然有:&a href=&//link.zhihu.com/?target=http%3A//opengrok.github.io/OpenGrok/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OpenGrok&/a& 好多公司在用,&br&&br&早年一直在用 Source Insight,是比较好用,但是这商业产品十多年时间既不开源也不增加大的新功能,几大硬伤更是让我不得不抛弃它:&br&&br&&b&不跨平台&/b&:在我离开 Windows办公的时候,一路没有找到的代码浏览工具,只有在 Wine下运行 Source Insight,结果这家伙在 Wine下时不时给我来个崩溃。&br&&br&&b&支持语言少&/b&:少的可怜了,C++, Java, C#, 而已,且都是比较早的语言标准了,扩充点新语言扩充的相当别扭和残缺。&br&&br&&b&单线索浏览&/b&:这个比较恶心,只有一个主窗口,没有TAB同时打开多个源文件的功能,我追着一条线索看过去,想同时看第二条线索基本上没办法,只能第一条看完后,回退,回退,再回退,回到刚才的位置,然后再继续跟第二条线索。当前惟一的一个代码窗口,在我全局搜索一个东西时,就会被覆盖成搜索结果,搜索结果点到其中一项又会覆盖成对应的源代码,想要看回刚才的搜索结果就只有回退,回退,无法同时打开多处,对照查看。&br&&br&&b&多定义不友好&/b&:多处定义(比如代码里其实是多处宏条件,定义同一个接口的不同实现,或者多层定义)的时候预览窗口傻的要死。&br&&br&&b&自动预览问题&/b&:自动预览好用是好用,但有些时候连着跳几层,把我最想看的一层给跳过去了,这就比较坑爹,还不如我手动预览。&br&&br&这些问题在我刚开始的时候都没什么感觉,我试了好多代码浏览软件最终选择了 OpenGrok的时候,一对比,Source Insight 基本就是渣,人家 OpenGrok还开源。&br&&br&截图1:搜索界面和源代码树&br&&figure&&img src=&https://pic1.zhimg.com/50/v2-af6a1fbfaf74_b.jpg& data-rawwidth=&1600& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&https://pic1.zhimg.com/50/v2-af6a1fbfaf74_r.jpg&&&/figure&&br&截图2:具体代码&br&&figure&&img src=&https://pic1.zhimg.com/50/v2-19819feb95fcf_b.jpg& data-rawwidth=&1600& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&https://pic1.zhimg.com/50/v2-19819feb95fcf_r.jpg&&&/figure&&br&我比较喜欢 OpenGrok的地方有几个:&br&&br&&b&使用方便&/b&:架设是比较麻烦,特别你想改一下它的很多默认代码目录位置,但一旦架设好,基本就很简单了,在 SRC_ROOT下面 check out 你想要阅读的代码,然后 OpenGrok index 一下即可,增量更新索引。&br&&br&&b&基于 WEB&/b&:在服务端运行,基于 Web这样我多个设备都可以同时浏览,以前台式机和笔记本都要安装 Source Insight才行,现在跑在我自己的 nas上面(vps上面也有一份),你只要打开浏览器就行。&br&&br&&b&支持语言多&/b&:使用 Universal CTags 作为后端 parser引擎,支持进百种语言,你想得到的语言都有。&br&&br&&b&功能强大&/b&:web上浏览源代码时,具体点击函数名就跳转到定义处,可以方便的按不同项目搜索:定义,引用,文件名。右边有文档结构图,配合 web浏览器,还可以添加一些记录笔记和剪切分享的功能。&br&&br&&b&多线索浏览&/b&:这是我最喜欢的功能,选择一处定义,在浏览器上“在新标签中打开” 即可,原来的位置继续保留,随时对照查看,不会象 Source Insight一样只能同时打开一个文件,因为浏览器的多标签,你想打开多少个文件都可以,想搜索多少次都行,并且保留结果,看到比较会心的地方,使用
Chrome的 Evernote插件,剪切当前代码到你笔记里面,或者发送到你的 &a href=&//link.zhihu.com/?target=http%3A//gist.github.com& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&gist.github.com&/span&&span class=&invisible&&&/span&&/a&。&br&&br&&b&支持 iPad&/b&:因为是网页版的,你趟床上拿着 iPad看都没问题,看到重要的地方,增加一个书签,第二天在你的 mac上书签就同步过来了。没有mac的话,可以iPad在 Safari里面剪切到 Evernote,第二天 PC上接着整理。&br&&br&如今我基本把 Source Insight之类的只能在本地看代码的东西都卸载了,公司里面架设一套,家里架设一套 OpenGrok,把和项目的相关代码全部扔上去,一次创建索引,所有人都可以方便查看。&br&&br&&b&对比 Vim/Emacs + Ctags&/b&:&br&&br&我小项目也会用Vim+ctags/cscope 浏览代码,但 ctags只能看定义不能看引用,cscope可以看引用赋值,但只支持c语言(C++支持的都比较残缺)。虽然 OpenGrok 使用 ctags 做parser,但是仅仅做parser而已,扫描出来的东西会被分成定义,引用,赋值等数据放到 OpenGrok自己的数据库里面,下次修改了文件做增量更细会很快,不会有一大堆的tags文件,搜索又慢,又没有符号引用信息。&br&&br&再者浏览大项目,特别是动脑的项目,我不喜欢两只手都放键盘上,读代码还是右手控制鼠标就行了,左手有时得喝点饮料抽根烟什么的,或者干脆趟沙发上,用 iPad阅读,思考嘛,首先要足够放松。&br&&br&&b&对比 Android Studio , VS&/b&&br&&br&没错大型 IDE也能浏览代码,也能搜索符号定义,虽然也可以多线索浏览,但很多时候还没有source insight方便,而 source insight上面已经被我们秒了。大型 ide和 source insight 一样支持语言较少,要安装一堆东西不说,还得把你co下来的项目弄个工程文件,或者导入到当前 workspace,没有 OpenGrok那么方便专注,当你有可能阅读的代码涉及的语言比较多的时候,co下来增量index一下即可,不用任何多余的事情,更重要的是 IDE不能在 iPad 上看代码。&br&&br&加个比较图表:&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-c945d4d560f_b.jpg& data-rawwidth=&698& data-rawheight=&1783& class=&origin_image zh-lightbox-thumb& width=&698& data-original=&https://pic4.zhimg.com/50/v2-c945d4d560f_r.jpg&&&/figure&&br&&b&安装注意:&/b&&br&&br&1. 默认的数据文件(索引和交叉引用等)在 /var/opengrok 下面,注意 /var 分区的磁盘大小,很多 ubuntu, debian的默认分区,/var空间很小,可以挪到 /home/data/opengrok 下面,保证足够空间,否则索引生成失败。&br&&br&2. 源文件夹内的文件对 tomcat8 用户(debian下面 apt-get tomcat8后,使用 tomcat8这个用户来跑tomcat)对源文件有可读权限,很多以前的 windows下压缩出来的 rar文件解开后只有自己有读取权限,导致 tomcat8 用户无法访问时,opengrok会报一个:“File Not Find&&br&&br&3. 可以用 java7 + tomcat8跑 stable版本 0.12.1.6,而 0.13的 RC版本却需要java8,安装请注意。&br&----&br&&br&再放一张具体使用截图,可以配合 Chrome的各种插件在代码页面上标注重点,添加注释:&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-7355efc3da_b.jpg& data-rawwidth=&1211& data-rawheight=&836& class=&origin_image zh-lightbox-thumb& width=&1211& data-original=&https://pic2.zhimg.com/50/v2-7355efc3da_r.jpg&&&/figure&&br&搜索页面,在 linux-2.6.11.12项目中,对 kmem_cache_alloc搜索引用,除此之外还可以全局搜索,正则搜索,按类型搜索,搜索历史(项目目录需要是svn或者git本地仓库)。&br&&figure&&img src=&https://pic3.zhimg.com/50/v2-da_b.jpg& data-rawwidth=&866& data-rawheight=&660& class=&origin_image zh-lightbox-thumb& width=&866& data-original=&https://pic3.zhimg.com/50/v2-da_r.jpg&&&/figure&&br&--&br&最后,回答题主问题:&br&1. 方便的文件搜索与类搜索。输入文件名或类名,能够直接找到相应的文件。-----
(支持)&br&2. 方法跳转。在方法调用处,可以直接跳转到方法定义处。除了方法还应该支持类枚举等。(支持)&br&3. 支持java:支持&br&4. 支持mac:支持
当然有: 好多公司在用, 早年一直在用 Source Insight,是比较好用,但是这商业产品十多年时间既不开源也不增加大的新功能,几大硬伤更是让我不得不抛弃它: 不跨平台:在我离开 Windows办公的时候,一路没有找到的代码浏览工具,只有在 Wine下运…
&p&工作中写C++,不敢自称大神,也来斗胆分享(安利)一下经常使用的单元测试框架。&/p&&p&大家都对Google的C++ Style很熟悉了,但除了Coding Style之外,Google还有自己的单元测试框架:gtest (Google Test)和gmock (Google Mock)。&/p&&p&简介gtest的英文blog &a href=&//link.zhihu.com/?target=https%3A//blog.jetbrains.com/rscpp/unit-testing-google-test/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unit Testing C++ with Google Test - ReSharper C++ Blog&/a&,英文好的骚年可以直接食用,如果大家确实很需要,我也可以抽空翻译一个。&/p&&p&相关的GitHub链接:&a href=&//link.zhihu.com/?target=https%3A//github.com/google/googletest& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&google/googletest&/a& 可以阅读源码,check out下来使用。&/p&&p&————————正片————————&/p&&p&在Google工作,尤其是写C++的程序员,常常离不开写单元测试。所幸的是,Google提供了很成熟,也很使用的单元测试框架gtest和gmock。&br&gmock是gtest的一部分,也可以说是gtest中比较advanced的topic。至于使用场景(避免在单元测试代码中向production服务发送rpc啦,读取production的资源啦,绕过一些production环境中必须的权限来测试代码的逻辑啦)会在后面举例说明。&/p&&p&正式开始写长一点的C++程序之后,就会逐渐萌发出写unit test来保证代码正确性的需求。例如,一开始写的单元测试可能是这样的。有个函数实现加法:&br&int Add(int x, int y);&br&我们最开始会使用assert来做一些基本的测试:&br&assert(2 == Add(1, 1));
// 正常的用例&br&assert(1 != Add(1, 1));
// 异常的用例&br&assert(sum & Add(num1, num2));
// 溢出异常?如果num1和num2都是正整数的前提下,sum应该blablabla&br&其实在我们一开始学习写单元测试的时候,老师或者有人生经验的资深码农就已经告诉了&b&我们写单元测试的一些原则:&/b&&br&1)测试用例能验证函数的正确性(这条都通不过就……);&br&2)测试用例尽可能涵盖边界条件(例如遍历一个链表,头指针是空,只有一个节点,链表有N个节点,N是问题描述下允许的最大节点数等等);&br&3)一些异常和错误处理(例如往一个函数里传入空指针,传入空串,这个函数能否打印一些log,返回错误码,实现加法的Add函数如何检测和处理溢出等等)&br&最理想的情况下(时间很多!),应该尽量多写测试用例,以保证代码功能的正确性符合预期,具有良好的容错性。如果代码较复杂,条件分支较多,测试用例最好能覆盖所有的分支路径}

我要回帖

更多关于 java小游戏源代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信