代码之家  ›  专栏  ›  技术社区  ›  lu_K

在同一程序中使用OpenMP和MPI

  •  0
  • lu_K  · 技术社区  · 2 年前

    我目前正在为我的并行编程类做一个作业,在这个作业中,我需要按顺序编写相同的程序,然后使用OpenMP进行并行化,然后使用MPI进行并行化。

    在上下文中,任务是在随机字符矩阵中搜索回文。我已经有了大部分代码,我的问题是如何构建、编译和运行项目。

    我可以创建三个独立的程序,并独立运行它们,但我希望将它们全部合并到同一个项目中,以便三个版本在同一初始矩阵上依次运行。这使我能够对每个版本进行计时,以比较它们。

    我使用CMake作为构建工具。

    我的医生。txt:

    cmake_minimum_required(VERSION 3.21)
    project(<project-name> C)
    
    set(CMAKE_C_STANDARD 23)
    
    find_package(MPI REQUIRED)
    include_directories(SYSTEM ${MPI_INCLUDE_PATH})
    
    find_package(OpenMP REQUIRED)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
    
    add_executable(<project-name> <source-files>)
    target_link_libraries(<project-name> ${MPI_C_LIBRARIES})
    

    我使用以下命令构建项目

    mkdir build && cd build && cmake .. && make
    

    我的主要职能是:

    // All the header inclusions
    
    int main(int argc, char **argv) {
    
        // Initialisation.
        srand(time(NULL));
        omp_set_num_threads(omp_get_num_procs());
        double start_time;
        ushort number_of_palindromes = 0;
        ushort palindrome_length = 5;
        ushort rows = 25000;
        ushort cols = 25000;
        char **matrix = create_matrix_of_chars(rows, cols);
        printf("Matrix of size %dx%d, searching for palindromes of size %d.\n", rows, cols, palindrome_length);
    
        // Run sequentially.
        printf("%-45s", "Running sequentially ... ");
        start_time = omp_get_wtime();
        number_of_palindromes = find_palindromes_sequentially(matrix, rows, cols, palindrome_length);
        printf("Found %4d palindromes in %7.4f seconds.\n", number_of_palindromes, omp_get_wtime() - start_time);
    
        // Run using OpenMP.
        printf("Running with OpenMP on %d %-20s", omp_get_num_procs(), "threads ... ");
        start_time = omp_get_wtime();
        number_of_palindromes = find_palindromes_using_openmp(matrix, rows, cols, palindrome_length);
        printf("Found %4d palindromes in %7.4f seconds.\n", number_of_palindromes, omp_get_wtime() - start_time);
    
        // Run using MPI.
        int num_procs, rank;
        MPI_Init(&argc, &argv);
        MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        printf("%d: hello (p=%d)\n", rank, num_procs);
        MPI_Finalize();
    
        // Cleanup and exit.
        free_matrix(matrix, rows);
        return 0;
    
    }
    

    跑步时 ./<project-name> 顺序版本和OpenMP版本一个接一个地正确运行。然而,在跑步时 mpirun --use-hwthread-cpus ./<project-name> 该程序启动整个项目的8个实例(行“大小矩阵…”打印8次)。

    我的理解是,MPI区域由 MPI_Init(...) MPI_Finalize() 但事实似乎并非如此。我该怎么解决这个问题呢?

    提前感谢您的回答。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Victor Eijkhout    2 年前

    没有所谓的“MPI区域”。MPI使用仅通过网络进行通信/同步的独立进程。意思是:整个可执行文件在启动时的所有实例中运行。每一句话,甚至之前 MPI_Init 由每个实例执行。