Как импортировать OpenMP и MPI в большой проект CLion CMake? - PullRequest
3 голосов
/ 13 января 2020

Я новичок в OpenMP и MPI и хочу импортировать OpenMP и MPI в мой существующий проект CMake. Поэтому -

Сначала я создал очень простой проект MPI.

main. 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 processors\n",processor_name, world_rank, world_size);

    MPI_Finalize();
}

Я могу успешно скомпилировать и запустить проект с помощью команды:

$ mpicxx main.cpp -o main.out
$ mpirun -np 2 main.out

Затем я создал и настроил проект CMake используя CLion. Я также могу успешно скомпилировать и запустить его с помощью 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? Кажется, что я не могу просто объединить два CMakeLists.txt проекта MPI и OpenMP проект. Потому что я получил ошибку о флаге -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)

1 Ответ

2 голосов
/ 13 января 2020

Таким образом, мой первый вопрос - как я могу использовать несколько процессоров, точно так же, как «mpirun -np 4 xxxx» из терминала?

Когда вы компилируете программу MPI, число процессы не влияют на ваши параметры компиляции. Итак, ваш пример кода будет работать с несколькими процессами, как вы сами отметили:

$ mpirun -np 4 xxxx

Для этого в CLion, go для запуска / отладки конфигураций и добавления mpirun в качестве исполняемого файла, и -np 4 xxxx в качестве аргументов вашей программы, как показано здесь .

Но с флагом -fopenmp будут некоторые ошибки:

Я знаю, что компиляция программы openmp на Ma c с использованием clang не так проста. Вы можете взглянуть на этот ответ для получения дополнительной информации.

...