多精度FFTW共存
之前用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
实现和包管理器提供的相同效果,将双精度版本设置为默认的话,就直接configure
、make
、make 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
可以编译出两个精度不同,但可以共存的、支持mpi
的fftw
库,第一个后续可以生成libfftw3.so
(双精度版),第二个可以生成libfftw3f.so
(单精度版)。