写程序的一些经验

首先,最初的习惯和最初的老师很重要。一定要自己写过几万行以上程序的老师才能有好的习惯。如果没有好的老师,那么浏览一下编程风格之类的书籍或者网页(google)是很有益处的。

其次,从带学生开始,才知道原来连如何写程序也是要教的。

下面,我把几条经验写在这里,供以后的学生参考。

第零、Linux可以运行脚本,主程序实现最核心的功能即可,其他调参数、记录结果等等,都可以通过脚本实现。更方便,程序也更容易写。
第一、编一个程序,运行的时候实现所有的参数(接受参数、安排流程是主程序的主要功能),而不是给每一个参数编一个程序;
第二、把每一项子功能定义好,写成子程序。考虑的出发点是:凡是重复很多次的代码一定要用子程序(除非特别必要的时候为了可读性多写几次);凡是 可以使得流程更加容易读和理解的,用子程序,把细节藏起来;凡是其它的程序中可能用得着的模块,写成子程序。
第三、写文件的输出在Linux下可以用运行时候的重定向实现,直接打印即可,不用写文件。
第四、一定要有很详细的注释,假定两个月以后你需要来读程序,你得看得懂。假定有你的师弟师妹需要参考你的程序,他们得看得懂。

关于风格:大括号写在子程序(或者for循环,if语句)名称后面,还是下一行;对齐方式;注释详细到什么程度;通常函数几个返回值;子程序和变量如何命名(不能太短,也不能特别特别长),这些问题没有一个标准,但是要形成一个惯例,而且这个惯例最好与主流的惯例差不多。

其它的,我请编外补充一下。

igraph安装使用

如果已经安装igraph,希望找到编译时候的参数,可以用以下命令:
pkg-config –libs –cflags igraph
如何pkg-config没有安装,就先安装这个软件。

如果自己手动安装,则需要知道自己安装到的目录,例如/opt/igraph,然后产生相应的-I(头文件igraph.h所在的位置)与-L(lib文件,.a, .so, .DLL等文件所在的位置,例如/opt/igraph/lib)参数的值

如果自动安装,则在软件中心或者新立得管理器中寻找igraph,或者apt-get一下就行。

以下是手动安装过程:下载igraph软件(google),解压缩,在解压以后的目录中运行 ./configure –prefix=/opt/igraph,然后 make,最后sudo make install搞定。

正确运行igraph程序需要设置库的路径,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/igraph/lib(改成自己安装的路径),或者用静态编译。

petsc, slepc自由矩阵格式(matrix-free matrix)方法

Petsc、Slepc提供Matrix-free matrices的处理功能,只需要提供matrix-vector乘法就可以求解线性方程,以及本征值。参考slepc的ex3.c(http://www.grycap.upv.es/slepc/handson/handson5.html),petsc的ex44.c。

Preconditioner也需要考虑一下,测试一下速度。

一般情况下,求解最大本征值比较方便,但是也可以求解内部本征值,例如通过 -eps_target 0.0 参数求解0.0附近的本征值,也可以采用eps_harmonic方法来求解内部本征值。

同时petsc可以支持openmp+mpi混合并行模式(考虑使用Gerard的混合模式),前者应用于共享内存多核之间,后者应用于分布式内存之间。是否slepc也自然相应支持?

有时间看一下如何在acml(已经考虑openmp)的基础上编译petsc、slepc,并且让petsc、slepc利用acml的openmp功能。

重写直接方法、BBGKY、BBGKY2的程序。

考虑利用acml的随机数或者Sprng的并行随机数,重写GFPE的程序。

AMD数学核心库acml的安装使用

由于需要在共享内存机器上实现Lapack+openmp,安装acml(Intel® MKL也是可以的,不过考虑到服务器使用的是AMD多核心CPU就用acml了)。acml包含BLAS, Lapack, FFT, RNG四个部分,内建了openmp,也就是说不用手动控制多线程和多任务。在运用acml的程序中,只需要在运行的时候设置OMP_NUM_THREADS=n(例如export OMP_NUM_THREADS=n)就会以n线程运行。

根据操作系统和编译器,选择的acml版本,目前安装的版本是acml_gfortran_64bit_fma4_mp_int64用于gcc/gfortran编译器,acml_open64_64_fma4_mp_int64用于open64编译器。

安装目录/opt/acml。

编译方式:gfortran -fopenmp -m64 test.f -L/opt/acml/gfortran64_fma4_mp_int64/lib -static -lacml_mp -lrt
gcc需要加上-I, -lgfortran参数。
openf95 -mp test.f -L/opt/acml/open64_64_fma4_mp_int64/lib -lacml_mp
opencc需要加上-I,-lfortran参数
如果使用动态链接库so库文件而不是a库文件,需要
export LD_LIBRARY_PATH=open64_64_fma4_mp_int64/lib:$LD_LIBRARY_PATH

gcc(gfortran)是一个好的选择。

如果一定要使用open64的话,需要做以下open64的路径设置:
在个人用户.profile,或者/etc/profile文件添加:
AMDSDK_ROOT=/opt/amdsdk/v1.0
CodeAnalyst=/opt/CodeAnalyst
export PATH=$AMDSDK_ROOT/x86_open64-4.2.4/bin:$PATH
export PATH=$CodeAnalyst/bin:$PATH

由于open64的部分核心是32位的,必须安装i386的库:sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 libstdc++5:i386 libstdc++6:i386
然后建立lib64的符号链接:sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
注意,修改的路径在sudo下不能识别,必须用 sudo su – 模拟一个有通常路径的sudo用户。
(AMD的open64还是做的不够好!难道就不能完全64bit?)

fma4在Intel CPU上会出错,因此在Intel CPU上用acml_gfortran_mp就可以。当然,这种情况用Intel® MKL更好。

我会编辑一个gcc的和open64的Makefile。