程天舒
进军CUDA
经过上周的鏖战,终于用C++得到了令人满意的mPb结果,如图所示。Prof. Mayerich看了结果也觉得不错,于是提出下一个要求:并行计算提速。由于在C++里还是采用的CPU的串行计算方式所以十分耗时,尤其在图像与滤波器做卷积的时候只能计算完一个像素再移动mask计算下一个像素,如果能让所有像素同时计算卷积那速度将大大提高(理论上能够提高图像的像素个数N倍),这就是并行计算的思路。导师实验室的一大课题就是利用GPU的并行计算有时来加速算法的运行速度,可以说直到今天我才算接触到了实验室比较核心的技术之一,才算“入门”了。
C++结果与paper公开代码的matlab结果
实现并行计算的主要工具是CUDA(Compute Unified Device Architecture),是著名显卡厂商NVIDIA推出的并行计算架构,该架构使GPU能够解决复杂的计算问题。CUDA的发明使计算行业从只使用CPU的“中央处理”向CPU与GPU并用的“协同处理”发展。
从矩阵加法到二维卷积
如何学CUDA?看代码。在仔细研究了导师给的计算矩阵与标量乘法的代码后我大致对CUDA的运作流程有了一些了解:首先给GPU分配内存,然后在GPU上进行并行计算,最后把GPU的结果复制给CPU。然后我通过修改这段代码实现了矩阵加法的功能。矩阵加法在GPU上的计算方式如图所示,在GPU上分配三片内存空间,分别给两个加数a、b和一个和c,a、b、c中每一个计算单位对应图像中的一个像素,当两张图片(矩阵)相加时,a、b中对应位置的单位同时进行加的操作并把结果给c中对应位置的元素,可见在一次加法时间内实现了所有元素的加法运算。
GPU上的矩阵加法
简单的矩阵加法实现后一步跳跃到有些复杂的二维卷积。由于二元高斯函数的一阶偏导是可分离的卷积(具体概念参见--------),所以可以采用两次一维卷积来实现二维卷积,这便是周二下午我和导师达成的一致思路,谁料到不到五分钟后当我正准备开始码代码时,本来准备去接女儿的导师突然“破门而入”,气喘吁吁地说“不要用那个方法!”,经过一番解释原来是实验室的伊朗phd已经用分离的方法实现了高斯模糊函数,所以只要稍作修改就可以得到通用的可分离卷积函数,但是我们却不能用这种函数计算不可分离函数的卷积,导师希望我写一个更加普适的直接采用模板卷积的二维卷积函数。导师对工作的关注和精心布置真是可见一斑。
在写二维矩阵卷积函数的过程中最大的问题就是边界问题,因为对于边界上的点模板上的点会超出图片范围并与随机数进行运算得到异常的结果,导师说可以先把这些超出边界的点设为0,之后我们会用texture memory轻松的解决这个问题。
另外用CUDA有一个非常蛋疼的缺点就是你写给GPU运行的函数CPU是不认得的,所以这段函数编译器无法识别也不能debug,如果你想要监视某个变量的值只能把它先从GPU上复制到CPU上来在查看,所以必须在第一次写代码时就要100%考虑周到,终于,在正确的卷积结果出来的一刻,我笑了,好歹也挤上了CUDA这条船。
Texture memory
导师审查了结果后觉得没有问题继续加码:使用texture memory。其实由于太多计算机计算架构的知识缺乏,我到现在为止也不太清楚texture memory的具体概念,简而言之,GPU可以使用texture unit这种硬件来高速访问global memory使用texture memory的好处之一就是可以方便处理边界问题,当所访问的像素的下标超出图片范围时,texture memory会根据你规定的寻址方式(wrap/mirror…)返回图片上的点,就相当于在原图的8领域内复制了8张图。
导师讲解texture memory的草图
但是使用texture memory后出现了一个新的bug——卷积之后的结果在左侧和上测会出现黑边,经反复测试认定算法无误估计是texture memory的使用中出了问题,周五下午导师帮忙检查也没找出原因,准备在他的电脑上运行试试。
A lab of Star Wars
早就从办公室挂满魔兽的签名海报发现导师是游戏粉、科幻粉,尤其是星战粉,每次和Pavel聊起星战都激动得一蹦一蹦的,但却真没想到他的骨灰级别到了如此地步,直到今天帮实验室的主机贴标签。
实验室买来一台神奇的标签机,输入字母就可以打印出标签纸,导师正用它为实验室的大量主机贴上名字,他一边贴一边和Pavel聊,紧接着传来那股熟悉的兴奋劲,没错他们又在聊Star Wars,因为这些主机就是用Star Wars里面的行星命名的!OMG,当初我还以为我的主机名HOTH大概就类似HOST的意思吧,却没料到是一颗科幻中虚构的行星如图所示,so cool!BTW,我已经考虑要买什么星战周边送导师了。
实验室主机,标签机,HOTH
祖国的阅兵式
周四的晚上在实验室加班,一个bug调了大半天调不出来索性休息下来刷微信惊觉 “今天不是9.3大阅兵吗!不是等着看飞机护旗拉烟的吗!”于是赶紧打开睡眠状态的显示器,youtube搜直播画质太差,又找到CCTV官网,虽然不是高清但是是没有时延的真直播,等我坐定后已经升完旗习大大开始讲话了,耳旁祖国的声音与眼前祖国的美景让置身西方文化中的海外游子找到了渴望已久,失去已久的归属感。
虽然中国还在发展中,避免不了这样或那样的问题,但我相信她正在越变越好,越变越强,越变越美,正如天安门上的蓝天。我一定会回到并报效这片养育我的土地。
阅兵直播截图
王泽
这周的主要任务就是读论文。上周五的时候,shih老师要求找我谈话,说和Arnob(组里面的一个印度的博士)一起看一看用NPGD这个结构来做schottkey的photodetector有没有可行性。因为shih之前去以色列参加会议的时候,有一篇展示性的文章说,在金字塔的n纳米金硅基结构上,可以构成灵敏度很高的photodetector.
我先看的是会议上的那篇文章以及他的手稿,他的理论只要是建立一个schottkey的barrier。这个时候,只要使用的材料正确就可以。用的是Si作为衬底,做N级,金构成金字塔状,作为P级。具体的能级结构如下图所示:
光子的能量只要足够穿过schottkey barrier.就可以用其他的方法把它捕捉到,从而形成光电流。
会议里面的那篇文章的主要结构是金字塔状的P级(金),在文章中,也特别提出了那个结构的重要作用。主要体现在两个方面:1.金会产生surface plasom,这个对于hot electron的产生具有很好的加强作用。2.金字塔的金结构可以造成一个waveguide(波导),一方面把光子导入到surface plasmon比较强的地方。所以这个文章强调了这个金字塔的结构,我觉得这个再NPGD上面不太容易实现,和Arnob讨论过,主要还是觉得,先看论文为主。
这个是文章当中金字塔的结构和用FDTD仿真的结果。话说,有时间真的应该好好学习下FDTD,是用来解麦克斯韦方程组的常用的方法,仿真出来的场的分布十分的清楚。
在通过一个星期的阅读之后,好好地看了一下这些文章,做了一个总结式的PPT给Arnob看,下面是做的ppt的截图:
其中把每一篇文章里面的精华部分都找出来了,然后就是Arnob说需要我做一个表格出来,这样他在看的时候会比较方便,这个可能就是我下个星期的工作重点了。
这周也放了美国的劳动节(labor day),放了三天假,和实验室的两个博士和一个博后一起去美国国家公园玩了一趟,很开心,也比较累。也去休斯顿的第二大城市圣安东尼奥走了一趟,也算是长时间的实验室生活的一次散心吧~。下个星期也要准备GRE和申请啦。
黄煜
上周仿真的结果表明,如果我们能把所有球的z轴在x-y平面内的投影指向一个方向,那么控制误差会快速收敛。所以我这周一开始打算把一个用来使球指向一致的函数完成。一开始用的类似于穷举法的函数,所有球每转一个角度,对比一次,综合指向误差满足要求之后就返回值。实际运行发现,电脑找了一个小时没返回这样的值。后来我改变思路在一个小范围里面找相对好一点的值,使用的范围是正好使最大球旋转2圈的范围。修改代码之后运行速度快了很多,但是最后的收敛效果还是不是很好。然后我试着把梯度下降法的思想用到这个里面,使用如下的目标函数:
这里生成的
是一个三维向量,表达了球的Z轴指向,
是表示围绕Z轴旋转的函数。然后抽取和XY相关的值来得到目标函数:
这里atan2是MATLAB内置的一个函数,可以解决求反正切的时候分母为零的情况。然后我就让它运行了,生成到如下步骤的时候就开始报出现复数的错误了:
我这些仿真什么的所有的东西都是针对实数操作的不可能出现复数,这个问题困扰了我两三天,后来终于在美国的一个叫Matlab_Central的论坛找到了有人碰到和我类似的情况。原因是数值方法的不稳定性(numerical instability)问题的关键类似于刚性方程(stiff equation)。
在数学中,刚性方程是指一个微分方程,其数值分析的解只有在时间间隔很小时才会稳定,只要时间间隔略大,其解就会不稳定。目前很难去精确地去定义哪些微分方程是刚性方程,但是大体的想法是:这个方程的解包含有快速变化的部分。造成的现象就是同一个方程,拥有统一个精确解,但是用不同的数值解法(例如Euler method, Runge-Kutta method)就会得到不同的解,甚至步长如果没选好还会引起迭代过程发散,从而无解。
Aaron说他觉得是我们用了传统的旋转矩阵的问题,建议我换成四元数。但是MATLAB内置的四元数操作函数不多,我要想实现对四元数求导(Jacobian Matrix)需要自己写很多函数。我仔细研究一下发现,并不是旋转矩阵的问题,而是我用了MATLAB一个求数值倒数的函数VPA()的问题。但是用这个函数是不可避免的。
后来我还一度想用共轭梯度法(conjugate gradient method)因为它根本不用求导,然而我找不到合适的正交矩阵A。我后来试着把目标函数改成二阶中心矩:
然后运行发现没有警报了。
算是碰巧把问题解决了,后来Aaron和我开会的时候强调我的梯度下降法还是有问题的,因为规划问题不是单一模型的(unimodal),然后我把自己的方法和梯度下降法合起来就解决了这个问题。
灵感来源于这个图:
表示每个极大和极小值都会间隔pi*max(rads)/2,所以我用这个间隔然后在比较小的区间里面取点,用使目标函数最小的点作为初值,然后再用梯度下降法迭代,现在穷举法每步只计算41个点,而之前计算20000个点,所以这个方法可以大幅提升计算速度。
李慧晗
这周主要用Arduino Teensy 3.1的板子控制30个rgb LED灯,从内部点亮3D打印的大脑模型,来指示大脑不同的活动区域。Rgb LED灯的显色模式和电脑显示一样,所有颜色可以有不同成分的Red,Green,Blue三种颜色合成,一共可以显示255^3种颜色,LED灯有四个引脚,分别作为电源线和数据输入输出线。
初步的设想是先用30个LED灯显示偏蓝色灯光作为背景灯,由不同频率和幅值的正弦R, G, B值合成,不断点亮熄灭,大脑活动区域用2-3个LED灯代表,可以用不同的颜色代表不同的情绪。
Arduino可以用C或者C++写。Teensy 3.1有2Kb的EEPROM,可以储存一定量的数据,用 EEPROM. Read( )和EEPROM. Write( )指令来读写数据。
如果数据超出储存范围就需要安装SD card shield外接SD卡,用SD.openfile来打开储存的文件。
图初步做好的有15个LED灯的模型
这周的周末是美国的劳动节,放三天假,周六白天和同学一起去OUTLETS逛了一圈,晚上和戴政泓一起在休大的TEDCU Stadium看了UH和Tennessee Tech的橄榄球比赛,只要穿红衣服带上学生卡就可以入场看比赛。在比赛之前完全不了解橄榄球,看比赛的时候才研究出来规则,非常有意思,感觉是力量和速度的比拼,美国人真的很热衷橄榄球比赛。
韩聪
时间过得很快,不知不觉间三个月已经过去了一个半月。
现在我仍在思考解决钉子的问题,由于我在专业里没有怎么学习关于图像处理或者数据处理的知识,所以一直没想出比较合理的算法,系统定量的解决方法。我能做的就是不停的仿真,期望获取更多的数据,通过总结分析数据来获取一定的规律。在仿真钉子直径变化时,这个结果比较理想,突出了很强烈线性化特征,尤其是归一化处理之后,更为明显。在仿真钉子距板端间距的时候,我控制钉子间的间距不变,每次少一个钉子。这样的话虽然控制住了钉距这个变量,但是却改变了数目的变化,对实验结果可能也有很大影响,所以还需要进一步仿真。现在最棘手的还是钉子长得影响,钉长的变化会影响电流的走势,进而变化的规律会不明显一些,甚至可能受板子长、宽、厚影响,成为一个多元函数。所以我现在决定分组仿真。即类似于单独计算PEAK SAR时候,分别测量长,宽,厚的影响。我想如果像这样有很多数据之后,一定会有跟多的新发现。即使这样不行,那么多一些数据量,对最后不得已使用的神经网络方法也会提供大量的数据。
这个周末是美国的劳动节,有三天的假期。周末在学校体育馆举行了football比赛,据去的同学说,比赛非常的有趣,精彩!下回有比赛的话我一定要去看看。
叶庆莹
这一周我开始了第一次的组会presentation,主要讲的是false memory的一篇文章Not All False Memories Are Created Equal: The Neural Basis of False Recognition.作者是Rachel J. Garoff-Eaton, Scott D. Slotnick and Daniel L. Schacter.讲的顺序是按照Purpose of the study、methods、main results、discussion、significance and conclusion来的。错误记忆(false memory)分为记忆相关认知(related false recognition)和记忆无关认知(unrelated false recognition)。比方说,给你一组包含25个单词list,看一定的时间,然后过一段时间之后,再询问是否见过某个单词。一种类型是,比如在之前的list里面出现过Sleep,但后面回答见过night,这是一种记忆相关认知,还有一种是完全没有联系的纯粹记错。
这篇文章主要讲了记忆相关认知和记忆无关认知虽然都是false memory里面的,但其实他们的机理并不相同。采用的方法是实验和功能性核磁共振方法,来检测在受刺激时脑部的活动区域。最后从实验结果分析来看,正确认知和记忆相关认知的机理是相同的,与记忆无关认知是不同的。
图一 实验原理图
图二 功能性核磁共振结果
这一周还去参加了一个seminar,COMPRESSIVE IMAGING FOR MATERIALS ANALYSIS: FROM NOVELTY TO PRACTICALITY AT RICE,压缩成像理论对材料的分析,以及Rice大学扫描隧道显微镜的对金纳米带的研究。整个seminar气氛严肃,话题也比较难。
图三 研讨会现场
这周周末是UH的第一场橄榄球赛,我们有幸和休大的学生一起欢呼和呐喊,整个球场气氛异常热烈,大家都为底下奔跑着的选手们呐喊助威,C-O-U-G-A-R一词被反复的喊出,现场是一片红色的海洋,还有吉祥物cougar的人偶出场,超级可爱。
图四 橄榄球赛现场
储晓青
这周的主要任务是学习制作钠电池并进行电化学测试,还有就是制备MoS2超级电容器的电极材料并进行电容性能的三电极测试。因为在华科时学习过装配钠电池,所以这些学起来还是比较简单的。在向这边的学长学习的过程中,我发现每个课题组在做同一个实验时总是有各自的技巧和经验的,所以能够在不同的实验室里学习真是一件幸运的事,可以进行比较从而得到最优的实验技巧。在做超级电容器的实验时,由于不同的实验步骤借鉴的不同的文献中的实验方法,所以在我的实验中出现了一个致命的错误,导致之后的电容测试失败。后来,我和学长才发现这个问题,并通过查阅其他文献改善了实验方法,将电极片基底从铜箔改为耐蚀性更强的不锈钢片,这样才得到了一个稍微正常的CV曲线。但是片层状的MoS2材料搁置时间太久,有些变质,得到的数据图和文献上的相差较大,所以后期打算重新制备一批片层状MoS2材料。Dr. Yao的建议是用传统的双电层电容器材料活性炭先做三电极测试,看看能不能得到正常的CV曲线,用来验证是测试过程出现了问题还是材料本身的问题。
戴政泓
这周,我们的实验有了很大的进展,周三早上来到实验室,刚准备检查一下昨晚做的样品,就收到了Romel的一条的短信“we got something different, it looks amazing!”,放下手机赶紧找了台显微镜看了看,发现基片上有大面积的薄膜。因为之前看的文献中有一篇讲的就是正方形的MoS2薄膜,欣喜万分,赶紧找了同实验室的学姐做了PL和Raman测试。可是,下午测试Raman测试结果出来MoS2的两个典型吸收峰在我们的样品中都没有发现,只好发邮件请教了学长,他说这应该是Mo还没有被硫化,建议我们控制硫的质量和通入时间,邮件最后的一句“However, you guys are closer to the destination.”也让我们得到不少安慰。
9月2日得到的样品
文献中的MoS2薄膜
文献中没有被硫化完全的Mo
熊诚
这一周在准备GRE和实验的反复测试和调试中度过了,最近才发现原来boss是一个中国迷,尤其爱喝茶,这次的组会boss和我们大部分时间在聊中国的历史和中国的茶叶,我们还一起喝了茶,这一周经过我们的反复实验,实验数据终于有了一定的起色,sensor终于开始在有规律的反应溶液的硫含量,也不枉我们每天奋斗到十点半,在这边实验这么久,最大的感受就是人的极限其实是被逼出来的,你永远不会知道自己能够坚持那么久,实验的那几天,从早上到晚上,中饭晚饭都在实验室解决,从看到早上的太阳到看到晚上天黑,中间就没怎么走出去过,不过这种奋斗的感觉让人很充实,换来周末睡到中午。Boss最后还请我们吃了一顿越南菜Kim Song。
UH最近在迎接新生所以有很多的活动,不过由于在准备GRE,都没有怎么参加。