首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

我的大学----Intel实习记实(作者于振南)

我的大学----Intel实习记实(作者于振南)

                                                                    我的大学
                                        --Intel实习记实                         
 初到北京几天,按照预先计划,去北京Intel公司进行面试。
 北京Intel公司位于中科院计算所附近。一下午先乘轻轨,又换坐汽车,到达Intel公司已是傍晚时分。我进入融科中心,直接来到了八楼----Intel办公地点及实验室的所在。
 在前台登记完毕,随后贴上了专门的标识,在工作人员的带领下我走进了Intel。首先参观了硬件测试实验室。刚进入其中,心中不禁一颤,这才是真正的硬件实验室。实验台上放满了用以进行测试的仪器及电路板,这一幕是我在学校实验室所没见到过的。最吸引我的是那几块Xilinx的个头很大的FPGA芯片,当时我心中在说“太帅了”。后来经过询问才知道,他们在用FPGA来测试Cache。
 我被安置在一个较小的屋子里,不一会儿两名Intel的工程师走了进来,落座之后,正式的面试便开始了。
 “请你讲述一下你Intel杯作品的具体情况”
 于是,我开始对作品中的各个部件进行详尽的剖析。不停在书写板上圈圈点点,为得是让他们能够听得更明白。从控制器、电路、数据链路、传感器到操作系统等等,我力图讲到精练易懂。其实我心中一直在担心一件事情,就是他们会在我讲述的过程中,在电路方面问出一些过于专业或是要求进行量化的问题,还有就是问一些FPGA方面的问题。因为我知道在Intel公司里大多数时候都是在作电路,FPGA使用得很频繁。而这些工程师在这里工作起码也有五六年,所以他们是这方面的权威了。这样的话,就如同鸡蛋碰石头。
 果然,他们开始发问了。
 “你这个系统中控制器外部时钟多少?控制器有多少引脚?”
 “24MHz,44P”
 “你知道我们这里频率上到1GHz是什么样子的吗?我们这里有的芯片是1000多个引脚,你觉和44脚有什么本质上的区别吗?”
 我知道他有可能会问这样的问题,前面的第一个问题就是个引子。频率上到那种频率后在信号完整性会出现问题,这里用到的芯片显然比我用的芯片规模要大的多。我想我不能正面去回答这个问题,否则他们一定还会顺藤摸瓜问出更细的问题。我要把话题再拉回到Intel杯作品上来。
 “关于时钟频率,在我们的作品中,核心CPU的频率是800MHz,我们在作核心部分的时候就是从板级开始作的。关于芯片引脚的问题,这里的芯片和作品中的控制器根本不是一个概念的东西,如果在作品中用1000多个脚的芯片来作控制,显然不合适。”
 ……
 一翻翻地提问,我又一次次地作出回答,到后来,问题开始回到他们的本行了,很多是关于FPGA的,这些并非我的强项,我只能尽力作答。
 几个小时过去了,他们最后问道:
 “你想来这里研究哪一方面?”
 “ARM”
 “呵,Intel没有ARM了,Xscale已经卖掉了。”
 “FPGA”其实我对FPGA也不是很熟悉,这里仿佛一种投其所好的意味了。
 “好的,就这样吧。”
 在Intel公司的面试就这样结束了,工作人员把我送上了电梯,送我出了融科大厦。我独自走了一段路程,此时天色已经较晚。回头看看高高悬于空中的Intel的标志,霓虹闪烁。这就是中关村的夜景了,中国最具IT味道的地方。再往前走一段,是AMD的办公大厦,标志同样高悬在上。心中想,他们谁将是处理器的霸主呢?呵,我似乎有点多管闲事了,我不禁自嘲。
 
                                                                       奋斗
 次日,接到Intel的电话:
 “我们这里有一题目,就是将原来用C写的算法,转成硬件描述语言,不知你有没有兴趣?”
 “也就是算法的硬实现吧,我很感兴趣。”以前想过硬实现方面的问题,没想到竟与Intel的题目不谋而合。
 “那好,现在我们会发一道题目到你邮箱里,如果你能在一个星期内完成,我们将进一步规划你实习的事宜。”
 “好的,谢谢您。”
 很快,我的信箱里就收到了一封新的邮件。
 在题目中,包含了上千行的C++代码,描述了一个用于统计计算的算法。其实刚拿到代码,我头就有点晕,不知道它具体实现的是什么功能。不过不管它的功能如何,按照题目的要求,都要保证在转为硬件描述语言后要使输出相同的结果。所以我第一步要作的是先把代码编译一遍,看一下输出。
 在它的源代码文件夹下有一个makefile,这就需要在linux下进行编译。我找了一台装有linux的计算机,对代码进行了成功编译。但当我把它运行起来的时候,我不尽吃了一惊,也感觉莫名奇妙----它竟然没有任何输出。我离开了座位,开始踱来踱去思考这个问题。可以是当我再次看屏幕的时候,发现了一行“run ok!”,随后是几个数据。我的天!这个程序运行了足足有三分钟啊。区区一千多行代码竟然运行了这么长时间。我的第一感觉是,这个算法一定很复杂,运算量一定很大,看来Intel是在故意为难我。
 这样足足一个星期的奋斗开始了……
 第一步是把现在的用C++写成的算法钻研透,能够作到真正掌握它,知道它每一个细节。所以我花了整整一天的时候来研读算法。程序中除了与算法相关的内容,还有一些是调用linux系统的一些API,来实现对程序运行时的监控,用来模拟硬件仿真。这些代码是与算法无关的,因此可以把它们剔除。
 剩下代码有很大一部分在描述一个数学模型,刚开始看那可是一头雾水。其实我最发怵看别人的代码,有一种自己的思想受制于人的感觉,多半时候都看不下去。但现在代码就摆在面前,还是要硬着头皮看。我想,我要想把这个算法看懂,我首先要把这个模型搞清楚。于是决定上网google一下。
 Google…. Google…. Google….
 呵,还不错,搜到了两个资料,虽然是E文的,但还算是自然语言。仔细研读了一个上午,终于算是有了个眉目。
 这回再回到那一堆代码里,感觉才不那么抽象了。一看又是大半天,总算对它八九不离十了。
 我才明白它为什么要run那么长时间了,也才领悟到为什么要进行算法的硬实现了。程序的功能是进行一种统计性的运算,设定一个动作重复400000000次,最终统计它各种情况出现的概率,这漫长的三分钟就花在这个400000000次上了。而如果把这些耗时很多的算法作成ASIC的芯片,那就将会从数量级上缩短运行的时间,最终实现所谓的HPC(高性能计算)。
 要对现有代码有很深刻的了解,我想我有必要把它亲手改写成纯C的,并且保证输出结果相同。这样不仅能够证明我已经掌握了该算法,也从一定程度上说明最终转为HDL的可行性,同时其实也降低了转换的难度,从面向对象的C++到面向过程的C,再从面向过程的C到用于描述的HDL,此时我已经站在C的层次上了,我有信心完成从C到HDL的转换。
 我装上了久违的ISE,还是ModelSim,这些软件在Sunwise的时候都接触到过,现在又拿来安装,还算比较亲切,不过还需要温习一下。于是,又从网上baidu了一些相关资料,熟悉了半天的开发软件,感觉ISE的环境确实比Altera的MAXPLUS和QUARTUS要好,还有就是重新见识到了Modelsim的强大。OK,欲善其事,先利其器!
 其实从C++到C,再到熟悉IDE都算简单,最难的部分在于HDL。对于VHDL,其实我也是个二把刀,原来学过的那点皮毛到现在已经剩不下什么了。但对于基本语法和描述结构还在脑子里。所以我打算来一个星火燎原,凭着这点仅剩的零星知识,编干编学,估计这样的学习效果更好呢。
 毕竟这里不比在哈尔滨,纸质的资料有限,所以我又从网上下了些HDL的教程,就这样看一段C的函数,查一查资料,编一些代码。如此重复,几百行代码不到一天的时间已经转换了80%了。其实,大部分和底层电路的关系不是很紧密,转换的过程考虑得只是逻辑实现方式的转变。
 算法的逻辑是80%,而剩下的20%是什么呢?那不和硬件紧密相关了。也就是说,这20%的逻辑转换过来,硬件上是不能直接实现的,这就需要一个折中的办法了。用现有硬实通过一定的手段间接对这部分逻辑进行实现。
 在C中,我们在进行数学计算时,会经常遇到浮点小点,也会经常遇到一些数学上的定义,如Sin、Cos等等,这个时候我们通常不会去自己实现这些函数,而是直接调用数学库。对于库内的具体实现我们是不关心的。但在HDL中是不能对浮点直接进行计算的,同时也不支持相应的库函数,这就是一个最大的难题。这如同一座火焰山,让我无法逾越,到最后实现我足足花费了三天的时间。
 首先要攻克的第一个难题就是对算法中的一些涉及三角计算的函数的实现。刚开始我的想法是采用麦克劳伦展开,然后取前四项之各,对三角函数进行逼近。但我转眼又想,这样作的计算量是很大的,因为展开式中会有一些阶乘项和指数运算,也许我可以找到C的数学为的源代码,那里面或许会有更好的算法。Windows里是不太可能了,还是到开源的linux里去找吧,经过千辛万苦我终于找到了一些三角函数的源代码,但打开一看,我就快吐血了----原来数学库里的函数都是用汇编写的,晕死!我还是回到原来的方法,我先用C对麦克劳伦展开进行实现,调试成功后再转为HDL,然后在仿真中看函数的输出波形,以保证函数的正确。
 在C里调试,转为HDL,仿真,看波形,再修改,仿真……这个过程重复了几十遍,一个个的函数在仿真中通过,离最终整体的算法实现又进了一步。
 此时,最大的困难就是浮点运算了。如果要我设计出一整套浮点运算库,这显然不现实,因为我只有一天半的时间。于是,我需要去询问Intel是否可以提供现成的浮点运算库。上午我的E-Mail发了出去,同时在E-Mail里面也附带了我现阶段的研究结果。下午的时候,收到了来自Intel的邮件,里面首先对我的研究结果进行了肯定,另外对于浮点运算库提供了支持。
 他们提供了一个现成的德国人写的浮点库,专门为FPGA设计。我喜出望外,最大的难题迎刃而解了。呵……
 这个库很大,我要把它加到我的程序里来,我先要把它编译成Library。也许是我的计算机太慢,足足花了一下午的时候,才把整个库编译出来。
 接下来一晚上的时间,先对这个库进行一个简单的功能上的测试,看看它是否计算正确。一项项地进行测试:浮点的加、减、乘、除、方根等很多部件均通过测试,在完成了对库的测试后,我又写一个测试报告,上交给了Intel,并告知他们,那个算法现在已经可以在FPGA上运行了。
 到此,我才得到Intel的承诺,同意我进入其中实习了。
 其实那些Intel的工程师真的是已经工作了五六年的老手了,我承认在经验上确实不可同日而语。其实后来听到了些消息,这道题在Intel内部作起来也是一个较大的工程,那些工程师也在吃惊我能如此快的完成。呵,这也为我增加了不少的信心,争取进去之后能有更好的表现。


                                                                                                                        
                                                                                                                                  于振南
                                                                                               哈尔滨工程大学计算机科学与技术学院  

返回列表