commit 8a436fe8d401497419a6d9a933feb28ad303105f Author: Saad Mohsin Date: Thu Sep 11 11:05:56 2025 +0500 initial commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..284ed2f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +FROM debian:stable-slim + +# Install g++, make, OpenMPI, AND the OpenSSH server +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + openmpi-bin \ + libopenmpi-dev \ + openssh-server && \ + rm -rf /var/lib/apt/lists/* + +# Create a directory for the SSH daemon to run (use -p to avoid errors) +RUN mkdir -p /var/run/sshd + +# --- SSH Key Generation and Configuration --- +# Generate a passwordless SSH key pair +RUN ssh-keygen -t rsa -f /root/.ssh/id_rsa -N '' + +# Add the public key to the list of authorized keys for passwordless login +RUN cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys +RUN chmod 600 /root/.ssh/authorized_keys + +# --- THIS IS THE NEW LINE --- +# Create an SSH config file to disable host key checking +RUN echo "Host *\n\tStrictHostKeyChecking no" >> /root/.ssh/config +# --- END OF NEW LINE --- + +# Allow root login via SSH +RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config + +WORKDIR /app + +COPY . /app/ + +# Compile using the MPI C++ compiler wrapper +RUN mpic++ -O2 -std=c++17 -o mpi_task task.cpp \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..54dc97e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,35 @@ +services: + master: + build: . + container_name: pdc-master + volumes: + - ./hostfile:/app/hostfile + command: > + sh -c "/usr/sbin/sshd & sleep 5 && mpirun -np 4 --hostfile /app/hostfile --allow-run-as-root /app/mpi_task" + networks: + - pdcn + + worker1: + build: . + container_name: pdc-worker1 + command: /usr/sbin/sshd -D + networks: + - pdcn + + worker2: + build: . + container_name: pdc-worker2 + command: /usr/sbin/sshd -D + networks: + - pdcn + + worker3: + build: . + container_name: pdc-worker3 + command: /usr/sbin/sshd -D + networks: + - pdcn + +networks: + pdcn: + driver: bridge \ No newline at end of file diff --git a/hostfile b/hostfile new file mode 100644 index 0000000..9c17876 --- /dev/null +++ b/hostfile @@ -0,0 +1,4 @@ +master slots=1 +worker1 slots=1 +worker2 slots=1 +worker3 slots=1 \ No newline at end of file diff --git a/task.cpp b/task.cpp new file mode 100644 index 0000000..2d6c7e3 --- /dev/null +++ b/task.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include + +int main(int argc, char** argv) { + MPI_Init(&argc, &argv); + + int world_size; + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + + int world_rank; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + + if (world_rank == 0) { + // Master process + std::string message = "HELLOWORLDFROMMPI"; // A longer string to see the effect + std::cout << "Original Message: " << message << std::endl; + std::cout << "Total processes (world size): " << world_size << std::endl; + + int msg_len = message.length(); + int part_size = msg_len / world_size; + + // Send each worker its part of the string + for (int i = 1; i < world_size; ++i) { + int start_index = i * part_size; + // The last worker gets any remaining characters + int current_part_size = (i == world_size - 1) ? (msg_len - start_index) : part_size; + std::string part = message.substr(start_index, current_part_size); + MPI_Send(part.c_str(), part.size() + 1, MPI_CHAR, i, 0, MPI_COMM_WORLD); + } + + // Master processes its own part + std::string master_part = message.substr(0, part_size); + std::reverse(master_part.begin(), master_part.end()); + + // A vector to store results in order + std::vector results(world_size); + results[0] = master_part; + + // Receive reversed parts from workers + for (int i = 1; i < world_size; ++i) { + char buffer[256]; + MPI_Recv(buffer, 256, MPI_CHAR, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + results[i] = std::string(buffer); + } + + // Combine and print the final result + std::string final_result = ""; + for (int i = 0; i < world_size; ++i) { + final_result += results[i]; + } + std::cout << "Final Result: " << final_result << std::endl; + + } else { + // Worker processes + char buffer[256]; + MPI_Recv(buffer, 256, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + std::string part(buffer); + std::reverse(part.begin(), part.end()); + MPI_Send(part.c_str(), part.size() + 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD); + } + + MPI_Finalize(); + return 0; +} \ No newline at end of file