2 / 1302_3_2
.pdflocalMin.index = j;
}
}
MPI_Reduce(&localMin, &globalMin, 1, MPI_2INT, MPI_MINLOC, 0, MPI_COMM_WORLD);
if (worldRank == 0) {
if (globalMin.index != i) { std::swap(arr[i], arr[globalMin.index]);
}
}
MPI_Bcast(arr.data(), n, MPI_INT, 0, MPI_COMM_WORLD);
}
}
int main(int argc, char** argv) { MPI_Init(&argc, &argv);
int worldRank; MPI_Comm_rank(MPI_COMM_WORLD, &worldRank); int worldSize;
MPI_Comm_size(MPI_COMM_WORLD, &worldSize);
if (argc > 1 && std::string(argv[1]) == "-- |
simple-example") { |
if (worldRank == 0) { |
|
std::cout << "\n--- Simple example --- |
" << std::endl; |
std::vector<int> simpleData = {8, 8, 5, 9, 2, 2};
printArray(simpleData, "Initial array"); sequentialSelectionSort(simpleData); printArray(simpleData, "Sorted array");
std::cout << "----------------------\n" << std::endl;
}
MPI_Finalize(); return 0;
}
11
const std::vector<int> testSizes = {10, 100, 500, 1000, 5000, 10000};
if (worldRank == 0) {
std::ofstream sortedFile("sorted_results.txt");
for (int n : testSizes) {
auto originalData = generateData(n);
std::vector<int> dataSeq = originalData;
auto startSeq = std::chrono::high_resolution_clock::now(); sequentialSelectionSort(dataSeq);
auto stopSeq = std::chrono::high_resolution_clock::now();
double durationSeqMs = std::chrono::duration<double, std::milli>(stopSeq - startSeq).count();
std::vector<int> dataPar = originalData; double durationParMs;
{
MPI_Barrier(MPI_COMM_WORLD); double startPar = MPI_Wtime();
parallelSelectionSort(dataPar, worldRank, worldSize); MPI_Barrier(MPI_COMM_WORLD);
double endPar = MPI_Wtime(); durationParMs = (endPar - startPar) * 1000.0;
}
std::cout << n << " " << durationSeqMs << " " << durationParMs << " " << worldSize << std::endl;
for (size_t i = 0; i < dataPar.size(); ++i) {
sortedFile << dataPar[i] << (i == dataPar.size() - 1 ? "" : " ");
}
if (n != testSizes.back()) {
sortedFile << std::endl << std::endl;
12
}
}
sortedFile.close(); } else {
for (int n : testSizes) { std::vector<int> dataPar(n);
MPI_Barrier(MPI_COMM_WORLD); parallelSelectionSort(dataPar, worldRank, worldSize); MPI_Barrier(MPI_COMM_WORLD);
}
}
MPI_Finalize(); return 0;
}
1302_3_2.sh
#!/bin/bash
# Конфигурация EXECUTABLE_NAME="1302_3_2_run" PROCESS_COUNTS=(2 4 6 8 10 12 14 16) TMP_RESULTS_FILE="results.tmp" SORTED_RESULTS_FILE="sorted_results.txt"
# Компиляция
mpic++ -std=c++17 -o $EXECUTABLE_NAME 1302_3_2.cpp if [ $? -ne 0 ]; then
echo "ERROR: Compilation failed." exit 1
fi
13
# Запуск примера
rm -f $TMP_RESULTS_FILE
rm -f $SORTED_RESULTS_FILE
mpirun --oversubscribe -np 2 ./$EXECUTABLE_NAME --simple-example
# Сбор данных
for p_count in "${PROCESS_COUNTS[@]}"; do
mpirun --oversubscribe -np $p_count ./$EXECUTABLE_NAME >> $TMP_RESULTS_FILE done
# Сортировка и вывод данных
sort -n -k1,1 -k4,4 "$TMP_RESULTS_FILE" | awk '
{
size = $1; p_count = $4;
results[size, "serial"] = $2; results[size, p_count] = $3;
if (!seen_size[size]++) { sorted_sizes[++num_sizes] = size;
}
if (!seen_pcount[p_count]++) { sorted_pcounts[++num_pcounts] = p_count;
}
}
END {
first_col_width = 17; data_col_width = 14;
total_width = first_col_width + 2; for (i = 1; i <= num_sizes; i++) {
14
total_width += data_col_width + 3; # (space + width + space + |)
}
border_line = "";
for (i = 1; i < total_width; i++) { border_line = border_line "="; }
print border_line
printf "%-*s |", first_col_width, "Parameter"; for (i = 1; i <= num_sizes; i++) {
printf " %-*s |", data_col_width, sorted_sizes[i];
}
printf "\n";
first_col_sep = ""; for(i=1; i<=first_col_width; i++) first_col_sep = first_col_sep "-"; data_col_sep = ""; for(i=1; i<=data_col_width; i++) data_col_sep = data_col_sep "-";
printf "%s-|", first_col_sep;
for (i = 1; i <= num_sizes; i++) { printf "-%s-|", data_col_sep;
}
printf "\n";
#Результат последовательной сортировки printf "%-*s |", first_col_width, "Serial (ms)"; for (i = 1; i <= num_sizes; i++) {
size = sorted_sizes[i];
printf " %-*.6f |", data_col_width, results[size, "serial"];
}
printf "\n";
#Результаты параллельных сортировок
for (j = 1; j <= num_pcounts; j++) { p = sorted_pcounts[j];
15
row_title = p " threads (ms)";
printf "%-*s |", first_col_width, row_title; for (i = 1; i <= num_sizes; i++) {
size = sorted_sizes[i];
printf " %-*.6f |", data_col_width, results[size, p];
}
printf "\n";
}
print border_line
}'
rm -f $TMP_RESULTS_FILE
echo -e "\nAll sorted arrays have been saved to the file '$SORTED_RESULTS_FILE'," echo "separated by blank lines."
16
ПРИЛОЖЕНИЕ Б Блок-схемы алгоритмов программы
Блок-схема последовательного алгоритма сортировки выбором
17
Блок-схема параллельного (MPI) алгоритма сортировки выбором
18
