Скачиваний:
0
Добавлен:
27.12.2025
Размер:
546.57 Кб
Скачать

localMin.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