本文转载自南方科技大学副教授于仕琪的个人公众号(ID:Prof_YuShiqi)
我这个学期教授“C/C++程序设计”。最近二十余年,计算机程序设计语言发生了明显的变化,本科教学中的Java和Python等更容易使用的语言的比例逐渐上升。
对于C和C++语言,学生普遍反映难度高、知识点多、语法灵活多变但难以掌握。乃至部分计算机专业的学生会质疑“我为什么要学习C/C++编程语言,从语法上来看,C/C++能做的事情其他语言也能做嘛。”
C/C++语言依然以无可撼动的地位,构建着一系列计算机基础软件。如操作系统Linux采用C语言设计;数据库软件MySQL采用C和C++设计。
在新兴起的人工智能和深度学习领域,虽然Python语言大量使用,但底层的计算模块基本全采用C++语言开发。其原因是人工智能算法皆是计算密集型算法,需要用C/C++开发以保证算法的执行效率。
本人认为:培养具有深厚基本功的计算机专业人才,C/C++语言是不可忽略的一门基础课程。我们不提倡重复造轮子,但我们需要有造轮子的能力。
与现在流行的Java、Python等语言相比,C和C++中的精髓是对内存的快速读写。正是这个特点让C和C++擅长计算任务,程序效率高。也正是这个特点,让指针这个知识点成为很多学生的噩梦。
我这个学期在“C/C++程序设计”教学中,尝试增加了提升程序效率的知识点。讲解如何快速实现两个含有200M个元素的向量的点乘(dot product),并布置作业实现矩阵乘法。
在矩阵乘法实现时,我要求计算含有百万元素的大矩阵乘法,并跟OpenBLAS库进行速度对比。同学们采用一系列方法,能够把计算效率提升几十倍,但速度依然只有OpenBLAS的十分之一甚至更少。我相信赶超OpenBLAS之后的“绝望”能够让他们意识到计算机系统知识的不足。
此外,在学校的支持下,还给同学们提供了ARM开发板,让同学们把程序在ARM开发板上运行,体验低功耗系统的特点,以及C/C++的必要性。
“C/C++程序设计”这门课的期末项目,是用C++实现CNN网络的前向推理,不能调用第三方库,要纯手工实现。
为了让同学们渐进式地入门,我在课堂上讲了CNN各种层的实现思路;同时让我的研究生冯远滔同学给他们训练了一个三层卷积模型,这个模型只含3x3卷积、ReLU、MaxPool和FC四种层。
这个期末项目会让学生有些痛苦,但我相信这会换来他们对自己能力的自信。在别人大谈特谈深度学习的时候,他们的嘴角能够泛起一丝微笑。
我对这些学生有期望的。能够进入南方科技大学的学生都是非常优秀的学生,有很大的成长潜力。我希望他们未来具有建设计算机基础架构软件的能力,即有造更高级的轮子的能力。
附期末项目要求:
阅读更多作者:于仕琪
原文链接:[C/C++]期末作业实现一个CNN?
- 博客园12月份特别活动来啦!
- linq 查询的结果会开辟新的内存吗?
- 小朋友都能看懂的 HTTPS
查看「博客园12月活动」及每日中奖名单