之前用CentOS,试图使用fftw-mpi的时候,报出了奇怪的符号symbol不存在的问题,稍加思索发现,居然是库版本不匹配的问题。自带的AppStream仓库有fftw,而fftw-mpi则没有,因而选择了使用第三方的OKey源来提供fftw-mpi

结果编译的时候还是出了问题(好像是openmpi的),选择自己手动编译安装fftw的依赖库。

然后注意到,在使用dnf安装fftw的时候,允许同时安装多精度的库版本,而自己编译的时候似乎没有看到类似的选项。翻查fftw的文档后发现,官方预想到了这种情况,提供了一条道路( http://www.fftw.org/fftw2_doc/fftw_6.html#SEC69 )。然而这个文档提供的是fftw2的编译教程,与现在使用的fftw3肯定是有差距的,例如里面的--enable-type-prefix选项就并不能用,configure会警告说是未定义的选项。

后来简单参考了一下configure自带的帮助内容,发现有一系列参数,叫--program-什么的,可以修改生成的目标库/头文件的命名,prefix就是加前缀,suffix就是加后缀。这里使用suffix实现和包管理器提供的相同效果,将双精度版本设置为默认的话,就直接configuremakemake install一把梭,其余版本则在声明精度之后,使用--program-suffix=修改文件名。比如编译float版本的时候,加入--enable-float的同时,添加--program-suffix=f,这样编译出来的库的名字是libfftw3f.so,就可以和原版的libfftw3.so相区别开来。

例如,命令行:

./configure --prefix=/usr/local/ --enable-shared --enable-mpi
./configure --prefix=/usr/local/ --enable-shared --enable-mpi --enable-float --program-suffix=f

可以编译出两个精度不同,但可以共存的、支持mpifftw库,第一个后续可以生成libfftw3.so(双精度版),第二个可以生成libfftw3f.so(单精度版)。

标签: none

添加新评论