我正在开发一个MPI应用程序,它需要运行MPI的特定实现(让我们称之为MPIvA).在我的工作站上,安装了MPI的另一个实现(我们称之为MPIvB).
我的应用程序是使用CMake构建的,find_library(MPI)显然指向MPIvB.它编译和运行没有麻烦.
我在我的工作站上编译了MPIvA.如何让CMake使用这些头文件和二进制文件?
CMake附带一个FindMPI模块,可以为您完成所有繁重的工作.
在你的CMakeLists.txt中,不要find_library(MPI)使用,而是使用find_package如下:
#### MPI
find_package(MPI REQUIRED)
if (MPI_FOUND)
include_directories(SYSTEM ${MPI_INCLUDE_PATH})
else (MPI_FOUND)
message(SEND_ERROR "This application cannot compile without MPI")
endif (MPI_FOUND)
Run Code Online (Sandbox Code Playgroud)
然后,只要您链接您的应用程序,请链接到${MPI_LIBRARIES}:
target_link_libraries(example-app ${MPI_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
现在的cmake会自动找到一个系统中的MPI实现.如果您有多个不同的MPI版本,并且想要指定要编译哪个版本,则可以将MPI_C_COMPILER和MPI_CXX_COMPILER变量设置为相应的mpicc和mpicxx编译器包装器.然后,CMake模块将使用它们来确定所有必需的编译器和链接器标志本身.
例:
cmake -DMPI_C_COMPILER=/usr/share/mvapich/bin/mpicc your-project-dir
Run Code Online (Sandbox Code Playgroud)
要确保cmake使用正确的MPI,请从新的空构建目录开始.
有关FindMPI模块的更多信息,请访问:https://cmake.org/cmake/help/v3.0/module/FindMPI.html
好吧,这不是一个新帖子,但将来可能对其他人有用。
尽管前面的答案也可以工作,但我认为更好的方法是使用CMAKE_PREFIX_PATH选项,即类似
CMAKE_PREFIX_PATH=~/my-libs-install-path ccmake ..
Run Code Online (Sandbox Code Playgroud)
现在,还有一些其他评论:
所有 MPI 库都应该是可互换的,即使用 MPI 规范的代码应该与任何 MPI 实现一起编译和运行(例如,我假设是 intelmpi、openmpi 或 mpich 的 MPIvA 和 MPIvB)。
关于这个答案(我的声誉不允许我发表评论,所以我在这里回复):
find_package(MPI REQUIRED)
if (MPI_FOUND)
include_directories(SYSTEM ${MPI_INCLUDE_PATH})
else (MPI_FOUND)
message(SEND_ERROR "This application cannot compile without MPI")
endif (MPI_FOUND)
Run Code Online (Sandbox Code Playgroud)
尽管功能大部分符合预期,但以下内容在功能上是等效的:
find_package(MPI REQUIRED)
include_directories(SYSTEM ${MPI_INCLUDE_PATH})
Run Code Online (Sandbox Code Playgroud)
如果未找到 MPI,findpackage(MPI REQUIRED)命令中的 REQUIRED 部分将导致命令失败,因此if(MPI_FOUND)部分无用,并且 else 子句实际上永远不会被执行。
最后,关于include_directories命令,在我的测试中,如果您使用目标,则不需要,例如
target_link_libraries(my_app PUBLIC MPI::C)
足够。
| 归档时间: |
|
| 查看次数: |
4572 次 |
| 最近记录: |