MPI::MPI_C 别名的使用

问题描述 投票:0回答:2

我正在使用 CMake(版本 3.20.1)构建 ScaLAPACK(提交

7e4e07070a489686287c36ab473d21cf29a54bdd
)。
find_package
实用程序在
CMakeLists.txt
中用于定义使用 MPI 编译所需的库、包含目录和标志。 ScaLAPACK 库使用别名
MPI::MPI_C
:

与 MPI 链接
target_link_libraries( scalapack ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} MPI::MPI_C)

我正在构建一个共享库,因此根据 CMake 默认行为,生成的 DSO 的

RPATH
中不应有任何条目。但是,已安装的库 DSO 在其
RUNPATH
中维护以下条目:

$ readelf -d ~/opt/scalapack/lib/libscalapack.so | grep RUNPATH
 0x000000000000001d (RUNPATH)            Library runpath: [/opt/apps/resif/aion/2020b/epyc/software/UCX/1.9.0-GCCcore-10.2.0/lib64:/usr/lib64:/opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib]

如果使用由

MPI_C_LIBRARIES
实用程序定义的库变量
find_package
来链接库,

target_link_libraries( scalapack ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} ${MPI_C_LIBRARIES})

那么安装的 DSO 中就没有

RUNPATH
条目。

进一步查看 CMake 生成的 Makefile,我注意到以下差异:

  • 有别名
    MPI::MPI_C
    :
# File: <build directory>/CMakeFiles/scalapack.dir/DependInfo.cmake
...
set(CMAKE_Fortran_TARGET_INCLUDE_PATH
  "/mnt/irisgpfs/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/include"
  "/opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/include"
)
...

# File: <build directory>/CMakeFiles/scalapack.dir/Dflags.make
...
C_INCLUDES = -isystem /opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/include

C_FLAGS = -O3 -DNDEBUG -fPIC -fexceptions

Fortran_DEFINES = -DAdd_ -Dscalapack_EXPORTS

Fortran_INCLUDES = -I/mnt/irisgpfs/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/include -I/opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/include

Fortran_FLAGS = -fallow-argument-mismatch -O2 -DNDEBUG -O2 -fPIC -fexceptions
...


# File: <build directory>/CMakeFiles/scalapack.dir/link.txt

/opt/apps/resif/aion/2020b/epyc/software/GCCcore/10.2.0/bin/gfortran -fPIC -fallow-argument-mismatch -O2 -DNDEBUG -O2 -Wl,-rpath -Wl,/opt/apps/resif/aion/2020b/epyc/software/UCX/1.9.0-GCCcore-10.2.0/lib64 -Wl,-rpath -Wl,/usr/lib64 -Wl,-rpath -Wl,/opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib -Wl,--enable-new-dtags -L/mnt/irisgpfs/apps/resif/aion/2020b/epyc/software/UCX/1.9.0-GCCcore-10.2.0/lib -L/usr/lib64 -L/mnt/irisgpfs/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib -shared -Wl,-soname,libscalapack.so.2.2 -o lib/libscalapack.so.2.2.1 @CMakeFiles/scalapack.dir/objects1.rsp  -Wl,-rpath,/home/users/gkafanas/opt/openblas/lib64: /home/users/gkafanas/opt/openblas/lib64/libopenblas.so -lpthread -lm -ldl /home/users/gkafanas/opt/openblas/lib64/libopenblas.so -lpthread -lm -ldl /opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib/libmpi.so

  • 带有变量
    MPI_C_LIBRARIES
    :
# File: <build directory>/CMakeFiles/scalapack.dir/DependInfo.cmake
...
set(CMAKE_Fortran_TARGET_INCLUDE_PATH
)
...

# File: <build directory>/CMakeFiles/scalapack.dir/Dflags.make
...
C_INCLUDES = 

C_FLAGS = -O3 -DNDEBUG -fPIC

Fortran_DEFINES = -DAdd_ -Dscalapack_EXPORTS

Fortran_INCLUDES = 

Fortran_FLAGS = -fallow-argument-mismatch -O2 -DNDEBUG -O2 -fPIC
...


# File: <build directory>/CMakeFiles/scalapack.dir/link.txt

/opt/apps/resif/aion/2020b/epyc/software/GCCcore/10.2.0/bin/gfortran -fPIC -fallow-argument-mismatch -O2 -DNDEBUG -O2 -shared -Wl,-soname,libscalapack.so.2.2 -o lib/libscalapack.so.2.2.1 @CMakeFiles/scalapack.dir/objects1.rsp  -Wl,-rpath,/home/users/gkafanas/opt/openblas/lib64: /home/users/gkafanas/opt/openblas/lib64/libopenblas.so -lpthread -lm -ldl /home/users/gkafanas/opt/openblas/lib64/libopenblas.so /opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib/libmpi.so -lpthread -lm -ldl /opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib/libmpi.so

看来别名设置了一些不必要的系统选项。

我有两个问题:

  1. 别名是什么以及如何使用它。
    为什么别名设置如此多的参数,而有人可能期望它仅设置用于链接 ScaLAPACK DSO 与 MPI 的变量。
c cmake mpi scalapack
2个回答
1
投票
MPI::MPI_C

是什么,也不知道它是否可以工作。这是我使用的:

MPI::MPI_C

这适用于单个源文件,但可以根据您自己的用途进行调整。


0
投票
find_package( MPI ) add_executable( ${PROJECT_NAME} ${PROJECT_NAME}.c ) target_include_directories( ${PROJECT_NAME} PUBLIC ${MPI_C_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} ) target_link_libraries( ${PROJECT_NAME} PUBLIC ${MPI_C_LIBRARIES} )

实用程序用无用的值填充了一些变量:

find_package

这些变量包含链接选项,可在生成的库的 
$ cmake -LAH -S . -B build ... // MPI C linker flags MPI_C_LINK_FLAGS:STRING=-Wl,-rpath -Wl,/opt/apps/resif/aion/2020b/epyc/software/UCX/1.9.0-GCCcore-10.2.0/lib64 -Wl,-rpath -Wl,/usr/lib64 -Wl,-rpath -Wl,/opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib -Wl,--enable- new-dtags -L/mnt/irisgpfs/apps/resif/aion/2020b/epyc/software/UCX/1.9.0-GCCcore-10.2.0/lib -L/usr/lib64 -L/mnt/irisgpfs/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib ... // MPI Fortran linker flags MPI_Fortran_LINK_FLAGS:STRING=-Wl,-rpath -Wl,/opt/apps/resif/aion/2020b/epyc/software/UCX/1.9.0-GCCcore-10.2.0/lib64 -Wl,-rpath -Wl,/usr/lib64 -Wl,-rpath -Wl,/opt/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib -Wl,-- enable-new-dtags -L/mnt/irisgpfs/apps/resif/aion/2020b/epyc/software/UCX/1.9.0-GCCcore-10.2.0/lib -L/usr/lib64 -L/mnt/irisgpfs/apps/resif/aion/2020b/epyc/software/OpenMPI/4.0.5-GCC-10.2.0/lib ...

中添加虚假路径。通过与别名目标链接,链接选项将添加到目标库。

目标

RUNPATH

MPI::MPI_C
别名库
,一种别名目标。别名目标指的是实际目标,在本例中是 MPI 的外部库,并且还可以定义其他属性,例如链接选项。看来在这种情况下,链接标志被添加到 MPI::MPI_Fortran
MPI::MPI_C
的目标链接选项中,因此与这些别名库链接时,我们无意中引入了虚假链接选项。
@VictorEijkhout建议的解决方案直接使用

MPI::MPI_Fortran

定义的变量来设置目标属性,从而避免了不必要的副作用。

    

© www.soinside.com 2019 - 2024. All rights reserved.