我目前正在为我的并行编程类做一个作业,在这个作业中,我需要按顺序编写相同的程序,然后使用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()
但事实似乎并非如此。我该怎么解决这个问题呢?
提前感谢您的回答。