随着工程代码量越来越大,pdb的尺寸也会一直增长。比如KlayGE核心没多大,但pdb已经到了73.7M。一个偶然的机会让我发现了vc的link一直以来都有个undocument的选项/pdbcompress。加上之后可以在生成pdb的时候自动打开NTFS的压缩。
由于pdb里面大量内容都是文本信息,即便是NTFS的压缩都可以得到比较高的压缩比。经常可以压到剩下1/3的大小。NTFS压缩的算法比较简单,压缩和解压的的速度也不错。所以在生成和调试的时候,读写速度并不会有很大影响。所以能用这个选项的时候还是尽量使用吧。
话说,这年头还有人不用NTFS吗?
KlayGE的源代码包里带了包括boost在内的所有第三方库。如果使用完整版的boost,那么大小会吃不消的。因为只用了boost中很少的一部分(列表在这里),以前用的方法是手工删掉了libs和tools等目录下所有不使用子目录,以及帮助文件和例子。通过这样的缩减,已经让boost从356M减少到了96.8M。但是,头文件的目录仍不容易直接删减,因为互相依赖很大。
上周空明流转大牛说他在SALVIA里也遇到了类似的问题,打算用boost自带的bcp工具处理一下。所以我也做了一下测试,用bcp来砍掉所有不用的库:
bcp atomic chrono filesystem program_options regex system thread algorithm any array assert assign bind circular_buffer container foreach ...
昨晚在升级了Intel和NV的显卡驱动之后,突然发现原先在程序中启用Optimus的NvOptimusEnablement失效了。及时回滚到老的驱动,仍无法解决问题。试了多种方法之后,最终发现在NV Control Panel的Manage 3D Settings里面点一下Restore,即便在UI上看不出什么,但NvOptimusEnablement恢复了作用!之前尝试失败的朋友不妨也用这个方法试试看。
偶然发现了一个检测浮点数是否是NaN的做法:如果f == f返回false,就表示f是NaN。对于float和double都管用。
在有些设备上只有float没有double,比如前几代GPU、部分移动设备等。当非得用到double精度的时候该怎么办?
我记得去年在某个地方见到过用2个float模拟double的作法,经过一番玩命地搜索,得来全不费功夫,就在CUDA SDK的Mandelbrot例子里找到了2个float模拟double乘法的函数。甚至,GTX280上的double也是类似的方法模拟出来的,所以慢的惊人,只有float八分之一的速度。(EDIT: Mandelbrot在GTX480上,float和double都可以到60-70 fps,模拟的话只有20-30 fps,Fermi的double速度上去了)
先show一下模拟乘法的函数dsmul:
// This function multiplies DS numbers A and B to yield the DS product C.
__device__ inline void dsmu ...