如何将 OpenMP 和 MPI 导入到大型 CLion CMake 项目中?
How to import OpenMP and MPI to a large CLion CMake project?
我是OpenMP和MPI的新手,我想将OpenMP和MPI导入到我现有的CMake项目中。因此--
首先,我创建了一个非常简单的 MPI 项目。
主.cpp:
#include "mpi.h"
#include "iostream"
int main(int argc, char** argv){
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf("Hello world from processor %s, rank %d out of %d processorsn",processor_name, world_rank, world_size);
MPI_Finalize();
}
我可以使用以下命令成功编译和运行项目:
$ mpicxx main.cpp -o main.out
$ mpirun -np 2 main.out
然后,我使用 CLion 创建并配置了一个 CMake 项目。我也可以使用CLion成功编译和运行它,但它只使用了一个处理器。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(Test)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
find_package(MPI)
include_directories(${MPI_INCLUDE_PATH})
SET(CMAKE_CXX_COMPILER mpicxx)
SET(CMAKE_C_COMPILER mpicc)
set(SOURCE_FILES main.cpp)
add_executable(Test ${SOURCE_FILES})
因此,我的第一个问题是如何使用CLion使用多个处理器?
其次,我创建了一个简单的 OpenMP 项目并成功运行。
但我的第二个问题是我怎样才能同时包含 MPI 和 OpenMP?看来我不能只合并MPI项目和OpenMP项目的两个CMakeLists.txt
。因为我收到有关-fopenmp
标志的错误:
clang: error: unsupported option '-fopenmp'
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(OpenMP_MPI)
set(CMAKE_CXX_STANDARD 14)
OPTION (USE_OpenMP "Use OpenMP to enamble <omp.h>" ON)
if(APPLE)
set(CMAKE_C_COMPILER "/usr/local/Cellar/llvm/9.0.0_1/bin/clang")
set(CMAKE_CXX_COMPILER "/usr/local/Cellar/llvm/9.0.0_1/bin/clang++")
set(OPENMP_LIBRARIES "/usr/local/Cellar/llvm/9.0.0_1/lib")
set(OPENMP_INCLUDES "/usr/local/Cellar/llvm/9.0.0_1/include")
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set(OpenMP_C "${CMAKE_C_COMPILER}")
set(OpenMP_C_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
set(OpenMP_C_LIB_NAMES "libomp" "libgomp" "libiomp5")
set(OpenMP_libomp_LIBRARY ${OpenMP_C_LIB_NAMES})
set(OpenMP_libgomp_LIBRARY ${OpenMP_C_LIB_NAMES})
set(OpenMP_libiomp5_LIBRARY ${OpenMP_C_LIB_NAMES})
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(OpenMP_CXX "${CMAKE_CXX_COMPILER}")
set(OpenMP_CXX_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
set(OpenMP_CXX_LIB_NAMES "libomp" "libgomp" "libiomp5")
set(OpenMP_libomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
set(OpenMP_libgomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
set(OpenMP_libiomp5_LIBRARY ${OpenMP_CXX_LIB_NAMES})
endif()
endif()
find_package(OpenMP REQUIRED)
if (OPENMP_FOUND)
if(APPLE)
include_directories("${OPENMP_INCLUDES}")
link_directories("${OPENMP_LIBRARIES}")
endif()
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
# set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif(OPENMP_FOUND)
find_package(MPI REQUIRED)
include_directories(${MPI_INCLUDE_PATH})
SET(CMAKE_CXX_COMPILER mpicxx)
SET(CMAKE_C_COMPILER mpicc)
add_executable(OpenMP_MPI main.cpp)
因此,我的第一个问题是如何使用多个处理器,就像 从终端使用"mpirun -np 4 xxxx"?
编译 MPI 程序时,进程数不会影响编译选项。因此,您的示例代码将适用于您自己提到的多个进程:
$ mpirun -np 4 xxxx
若要在 CLion 中执行此操作,请转到运行/调试配置,并将mpirun
添加为可执行文件,-np 4 xxxx
添加为程序参数,如下所示。
但是会有一些关于-fopenmp标志的错误:
我知道使用 clang 在 Mac 上编译 openmp 程序并不是那么简单。您可以查看此答案以获取更多信息。
CMakeLists.txt
不应该那么复杂。它应该是这样的:
cmake_minimum_required(VERSION 3.12)
project(OpenMP_MPI)
set(CMAKE_CXX_STANDARD 14)
find_package(MPI REQUIRED)
include_directories(SYSTEM ${MPI_INCLUDE_PATH})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
add_executable(OpenMP_MPI main.cpp)
target_link_libraries(OpenMP_MPI ${MPI_C_LIBRARIES})
对于 linux,应使用以下命令进行生成和运行。
mkdir build && cd build && cmake .. && make && mpirun -n 2 ./OpenMP_MPI
对于 MacOS,只需将命令更改为
mkdir build && cd build && cmake -DCMAKE_CXX_COMPILER=g++-9 .. && make && mpirun -n 2 ./OpenMP_MPI
它应该有效。(你可以转到/usr/local/bin
检查你的编译器是否是 g++-9。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 无法在 CLion 中构建 C++ 项目
- C++中高效的大型稀疏块压缩线性方程
- C++:如何在CLion IDE中安装Boost
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何实现高效的算法来计算大型数据集的多个不同值?
- IDE (CLion) 无法解析C++模板类型
- Clion显示错误,但可以使用Cmake成功构建代码
- 如何将 CLion C++ 项目导入 Visual Studio?
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- LMDB:在有限的内存系统中打开大型数据库
- clion 无法解析 std 类型
- 如何在大型c++项目的可视化代码中设置调试
- 在装有 CLion 的 Mac 上使用 C++ 连接到 MySQL 数据库时出现问题
- 仅在大型阵列上出现合并排序分段错误
- 在堆栈上C++大型多维数组
- atoi() 在应用于大型命令行参数时会产生不正确的值
- 如何让 CLion 显示异常?
- CLion 无法在 macOS 上找到 Eigen3
- 如何将 OpenMP 和 MPI 导入到大型 CLion CMake 项目中?