我目前正在為我的并行編程課程分配作業,我需要按順序撰寫相同的程式,然后使用 OpenMP 并行化,然后使用 MPI 并行化。
對于背景關系,該作業是關于在隨機字符矩陣中搜索回文。我已經讓大部分代碼作業了,我的問題是關于如何構建、編譯和運行專案。
我可以創建三個單獨的程式并獨立運行它們,但我想將它們全部組合在同一個專案中,以便三個版本一個接一個地運行,并在同一個初始矩陣上運行。這讓我可以計時每個版本來比較它們。
我使用 CMake 作為構建工具。
我的 CMakeLists.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 M 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 M 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 個實體時(“Matrix of size ...”行被列印 8 次)。
我的理解是 MPI 區域由MPI_Init(...)and分隔,MPI_Finalize()但似乎并非如此。我將如何解決這個問題?
提前感謝您的回答。
uj5u.com熱心網友回復:
沒有“MPI 區域”這樣的東西。MPI 使用僅通過網路進行通信/同步的獨立行程。含義:整個可執行檔案在啟動時運行在盡可能多的實體中。每一個陳述句,甚至是之前MPI_Init的陳述句,都由每個實體執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464197.html
上一篇:每次回圈迭代時,如何將不同的值存盤在變數中,然后將它們全部添加到c中?
下一篇:如何從最小的數字開始?
