Author Archives: fli10

windows xp 内存分配

这几天写程序,一直发现当程序分配较多的内存时会报错:
Unhandled exception at 0xxx in xx.exe: Microsoft C++ exception: std::bad_alloc @ 0x1198fc84,

查了一下原来XP只支持2GB的程序空间,程序想多用内存就没门了,只能用64位的xp了。
http://www.81ren.net/thread-6272-1-1.html

支持VLM(超大内存)   
在介绍VLM之前,我们回顾一下Windows NT 4.0内存管理的进化过程。因为Windows NT 4.0是标准的32位操作系统,32位指针能够访问的最大空间范围是2的32次方,也就是4GB。但用户的应用程序并不能使用所有的4GB空间,其中4GB的上半部分属于系统空间,操作系统的所有进程都运行在系统空间中。下半部分属于用户空间,但用户空间的最上层驻留的是系统的动态链接库(DLL),这样用户真正能够使用的空间就少于2GB。不过是这种把系统空间和用户空间分开的技术极大地增强了系统的可靠性。   

但2GB的应用程序空间对于大型企业应用来说,是远远不够的,于是微软在Windows NT Server 4.0中将用户空间调整为3GB,但是在这3GB空间中,系统动态链接库的位置并没有改变,这就是说用户的3GB空间并不是连续的,它被系统的动态链接库所隔断。   

随着计算机软硬件的飞速发展,许多大型数据库的容量达到了几百个GB,对内存的需求也大大地增加。为了更好地参与企业应用,Windows 2000对DEC Alpha平台提供了VLM支持。因为Alpha平台的所有指针和寄存器都是64位的,因此Windows 2000能够访问高达32GB的内存空间,其中最上部的2GB空间是系统空间,最下部的2GB空间是用户空间,中间的28GB也是用户空间,所有这些空间只有使用64位指针才能访问到,这就对Windows 2000的32位指针进行了64位的符号扩展。须要注意的是,中间的28GB内存空间是不可交换的,也就是说必须是物理上配置28GB内存,而不能利用硬盘上的页交换文件来进行模拟,此外VLM的I/O只能支持异步和非缓存I/O。对VLM的访问是通过VLMAPI来实现的,这些API是原有的虚拟内存管理API的扩展,但使用的指针和参数都是64位的。

camera多线程程序

最近写的camera图像采集程序是一个多线程程序,一个主线程创建了两个image grab线程。两个grab线程分别控制两组fps和resolution不同的camera,由于capture的桢率太高,120fps和30fps,所以无法实时存下image。因此我开辟了大量的内存,将capture的image先存到内存了,然后再不断的创建save image线程来存image,当一定内存区域的data存下来得时候,该save线程就把内存给free掉。

花了很多的时间才想到这个策略,实际上也是很有效的。然后写程序的时候,碰到了更多的问题。对于两个grab线程,我用了WaitForMulitipleThreads()来结束,而save线程,因为要考虑到实时性(save线程是在grab image的for循环里创建的,先grab一定数量的image, 然后创建save线程,然后再循环去grab),所以没有用WaitForSingleThread()来结束,直接创建了线程就不管了。这时候出现了很多问题,

1。我是在grab for循环里创建save线程的,也就是在for 循环里pack传给save线程的参数(内存指针,一些camera 参数,存image的路径等等),每次循环只更新部分参数。这样结果造成,参数在传给save线程之前是正确的,但是当save线程执行时,这些参数在save线程外得到了更新(因为thread函数传入的是一个void指针),在save线程里访问这些参数时,有可能被改变了,也有可能正在被刷新,这样造成了指针无法访问,char*出现了乱码。
解决方法,如果知道要创建的save线程数量,就开辟相应足够的空间来把这些传入参数统统存下来,每个save线程有各自独立的输入参数空间,这样就可以了。

2。grab线程只是grab image,然后new memory,创建save 线程就退出了。如果save线程的参数空间是new来创建的,这时候当grab线程结束,把save线程的参数空间给delete的时候,有些save线程还没有结束(磁盘操作是很花时间的),这样save线程就会报错了,参数丢失了。
解决方法,当每个save线程执行时,先把输入参数copy到该save线程自己的线程空间堆栈了,这时候如果输入参数空间被delete了,自己函数空间了也有备份,就一点问题都没有了。

就这些东西花了一个星期才搞兴趣,自己还是太笨了。

有点开始做research的感觉了

现在有点开始做research的感觉了。从上研究生到现在已经4年了,根本没有过在做research的感觉,感觉做的都是别人告诉你应该做的东西,用一些别人告诉你应该用的算法,当然大部分还是自己看paper知道的应该用的算法,但是自己的主动性还是不强,全身心参与的不是很多。

但是现在感觉有些发生了变化。这一个学期以来,发现都是自己决定买做实验用到的设备,小到一个螺丝钉,双面胶,一把手锯,大到一个camera,一个server,完全由自己亲自去买。读paper也是,自己去找相关的paper,自己感兴趣的paper。但是,看了一些paper后(!-_-, 自己看的还是太少)还是不知道要做什么。每当有个小的想法时,就会发现别人已经做过了,而且做得东西比自己想的还要多,效果也非常好。顿时有很沮丧的感觉。

如果一个人的努力能读出phd的话,也就不需要老板了。老板毕竟是老板,终究还是阅历丰富学识渊博,毕竟也纵横“江湖”比我多“几载”。虽然上个学期他也没什么idea,但是现在经过和老板的讨论,终于发现了一个很有意义的课题。有时候觉得自己要做个个方面,搭环境、设计算法、写程序,这些对自己都很陌生的,而且完全由自己掌握,自己不免会很兴奋。给自己加油,争取做出些有意思的东西来。

不能debug程序

今天在编译下载的SIFT程序时,一直弹出这个对话框,无法调试,忙了一晚上都没搞定。不知道这是怎么回事?

NoSymbolicInformationError

查了一下微软的msdn,说,

This dialog box appears when you attempt to debug a project that has no symbolic debug information available. This may happen if:
You attempt to debug a Retail configuration of a project rather than the Debug configuration.
You’ve changed the Debug configuration settings in the Property Pages dialog box.
You are opening an .EXE as a project.

Matlab也用了IPP?

今天debug程序的时候,查看了一下程序运行时调用的modules,发现调用下面几个:

ippcv20.dll C:\Program Files\MATLAB\R2006b\bin\win32\ippcv20.dll
ippcvw7.dll C:\Program Files\MATLAB\R2006b\bin\win32\ipp20\ippcvw7.dll
ippi20.dll C:\Program Files\MATLAB\R2006b\bin\win32\ippi20.dll

mkl_p4.dll C:\Program Files\MATLAB\R2006b\bin\win32\mkl_p4.dll

我的程序根Matlab没有关系,怎么会调用matlab路径下的东西?而且,matlab下怎么会有IPP和MKL的动态库,版本还那么老,难道Matlab也用了IPP和MKL来做在Intel CPU上的优化?

GNU Scientific Library (GSL)

GSL是一个开源的科学计算库,里面包含了矩阵运算、排列组合、多项式求解、随机数生产、FFT、概率tonji、线形拟合、小波变换等等,基本覆盖了科学计算的方方面面,效率应该是很高的(都是牛人写的,这一点应该没有疑问)。
Linux: http://www.gnu.org/software/gsl/
Windows: http://gnuwin32.sourceforge.net/packages/gsl.htm

自己发现Gsl也是很偶然的,在找SIFT implementation的时候看到了别人在SIFT的时候用了Gsl。就这样花了一些时间看了看Gsl,发现他还是很powerful的,不过有些运算也没法做,比如sparse matrix求解,这还得用taucs。Anyway,还是很有收获的。

开篇

本来是在MsnSpace写一些想记在笔记本上的东西,可是那个上面的人太多,而且总是有些人让我很不爽。今天在水源上看到有人介绍blogger,而且和google account结合起来,看起来很方便,很是喜欢。以后就在这里聊聊自己的一些体会,全当自娱自乐。

Topcoder Algorithm Tutorials

http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=alg_index

Topcoder has many excellent tuorials for algorithms that we meet everyday, for example, dijkstra and maxflow, which all were written by topcoder members. Usually, at the end of each tutorial, the author would often explain some applications for this specific kind of algorithm, and most of the applications are from the topcoder’s competition problems. It’s a nice place to start with if you want to improve your programming skills.