library(Rmpi)
mpi.spawn.Rslaves(needlog = FALSE)
mpi.bcast.cmd( id <- mpi.comm.rank() )
mpi.bcast.cmd( np <- mpi.comm.size() )
mpi.bcast.cmd( host <- mpi.get.processor.name() )
result <- mpi.remote.exec(paste("I am", id, "of", np, "running on", host))
print(unlist(result))
mpi.close.Rslaves(dellog = FALSE)
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define SIZE 3
// Function to print matrix
void printMatrix(int matrix[SIZE][SIZE]) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
}
}
}
// Function to multiply matrices
void multiplyMatrices(int a[SIZE][SIZE], int b[SIZE][SIZE], int c[SIZE][SIZE], int startRow, int endRow) {
for (int i = startRow; i < endRow; i++) {
for (int j = 0; j < SIZE; j++) {
c[i][j] = 0;
for (int k = 0; k < SIZE; k++) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
}
int main(int argc, char* argv[]) {
int rank, size;
int a[SIZE][SIZE] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int b[SIZE][SIZE] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}};
int c[SIZE][SIZE];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Calculate the number of rows each process will handle
int rowsPerProcess = SIZE / size;
int startRow = rank * rowsPerProcess;
int endRow = startRow + rowsPerProcess;
// Perform matrix multiplication
multiplyMatrices(a, b, c, startRow, endRow);
// Gather the results from all processes
MPI_Gather(&c[startRow][0], rowsPerProcess * SIZE, MPI_INT, c, rowsPerProcess * SIZE, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0) {
printMatrix(a);
printMatrix(b);
printf("\nMatrix C (Result):\n"); printMatrix(c);
}
MPI_Finalize();
return 0;
}
bGlicmFyeShSbXBpKQptcGkuc3Bhd24uUnNsYXZlcyhuZWVkbG9nID0gRkFMU0UpCgptcGkuYmNhc3QuY21kKCBpZCA8LSBtcGkuY29tbS5yYW5rKCkgKQptcGkuYmNhc3QuY21kKCBucCA8LSBtcGkuY29tbS5zaXplKCkgKQptcGkuYmNhc3QuY21kKCBob3N0IDwtIG1waS5nZXQucHJvY2Vzc29yLm5hbWUoKSApCnJlc3VsdCA8LSBtcGkucmVtb3RlLmV4ZWMocGFzdGUoIkkgYW0iLCBpZCwgIm9mIiwgbnAsICJydW5uaW5nIG9uIiwgaG9zdCkpIAoKcHJpbnQodW5saXN0KHJlc3VsdCkpCgptcGkuY2xvc2UuUnNsYXZlcyhkZWxsb2cgPSBGQUxTRSkKbXBpLmV4aXQoKQoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKI2RlZmluZSBTSVpFIDMKCi8vIEZ1bmN0aW9uIHRvIHByaW50IG1hdHJpeAp2b2lkIHByaW50TWF0cml4KGludCBtYXRyaXhbU0laRV1bU0laRV0pIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBTSVpFOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCBtYXRyaXhbaV1bal0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9Cn0KCi8vIEZ1bmN0aW9uIHRvIG11bHRpcGx5IG1hdHJpY2VzCnZvaWQgbXVsdGlwbHlNYXRyaWNlcyhpbnQgYVtTSVpFXVtTSVpFXSwgaW50IGJbU0laRV1bU0laRV0sIGludCBjW1NJWkVdW1NJWkVdLCBpbnQgc3RhcnRSb3csIGludCBlbmRSb3cpIHsKICAgIGZvciAoaW50IGkgPSBzdGFydFJvdzsgaSA8IGVuZFJvdzsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBTSVpFOyBqKyspIHsKICAgICAgICAgICAgY1tpXVtqXSA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgU0laRTsgaysrKSB7CiAgICAgICAgICAgICAgICBjW2ldW2pdICs9IGFbaV1ba10gKiBiW2tdW2pdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgICBpbnQgcmFuaywgc2l6ZTsKICAgIGludCBhW1NJWkVdW1NJWkVdID0ge3sxLCAyLCAzfSwgezQsIDUsIDZ9LCB7NywgOCwgOX19OwogICAgaW50IGJbU0laRV1bU0laRV0gPSB7ezksIDgsIDd9LCB7NiwgNSwgNH0sIHszLCAyLCAxfX07CiAgICBpbnQgY1tTSVpFXVtTSVpFXTsKCiAgICBNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwogICAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJnJhbmspOwogICAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnNpemUpOwoKICAgIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJvd3MgZWFjaCBwcm9jZXNzIHdpbGwgaGFuZGxlCiAgICBpbnQgcm93c1BlclByb2Nlc3MgPSBTSVpFIC8gc2l6ZTsKICAgIGludCBzdGFydFJvdyA9IHJhbmsgKiByb3dzUGVyUHJvY2VzczsKICAgIGludCBlbmRSb3cgPSBzdGFydFJvdyArIHJvd3NQZXJQcm9jZXNzOwoKICAgIC8vIFBlcmZvcm0gbWF0cml4IG11bHRpcGxpY2F0aW9uCiAgICBtdWx0aXBseU1hdHJpY2VzKGEsIGIsIGMsIHN0YXJ0Um93LCBlbmRSb3cpOwoKICAgIC8vIEdhdGhlciB0aGUgcmVzdWx0cyBmcm9tIGFsbCBwcm9jZXNzZXMKICAgIE1QSV9HYXRoZXIoJmNbc3RhcnRSb3ddWzBdLCByb3dzUGVyUHJvY2VzcyAqIFNJWkUsIE1QSV9JTlQsIGMsIHJvd3NQZXJQcm9jZXNzICogU0laRSwgTVBJX0lOVCwgMCwgTVBJX0NPTU1fV09STEQpOwoKICAgIGlmIChyYW5rID09IDApIHsKICAgICAgICBwcmludGYoIk1hdHJpeCBBOlxuIik7CiAgICAgICAgcHJpbnRNYXRyaXgoYSk7CiAgICAgICAgcHJpbnRmKCJcbk1hdHJpeCBCOlxuIik7CiAgICAgICAgcHJpbnRNYXRyaXgoYik7CiAgICAgICAgcHJpbnRmKCJcbk1hdHJpeCBDIChSZXN1bHQpOlxuIik7CiAgICAgICAgcHJpbnRNYXRyaXgoYyk7CiAgICB9CgogICAgTVBJX0ZpbmFsaXplKCk7CgogICAgcmV0dXJuIDA7Cn0K