#include <stdio.h>
#include "mpi.h"
#include <dirent.h> // For opendir(), readdir(), and closedir()
int directoryExists(const char *path) {
DIR *dir = opendir(path);
if (dir) {
closedir(dir);
return 1;
} else {
return 0;
}
}
int CountOccurrences(int target, const char *FileName) {
FILE
*file
= fopen(FileName
, "r"); if (file == NULL) {
return -1;
}
int count = 0;
int num;
while (fscanf(file
, "%d", &num
) == 1) { if (num == target) {
count++;
}
}
return count;
}
int main( int argc, char **argv )
{
const int Files = 100;
const int NumPerFile = 100;
int rank,size;
int x;
char FileNames[Files][30];
char recievedFileNames[Files][30];
int localCount = 0, totalCount = 0;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if(rank ==0){
char directory[30];
// take directory
do{
printf("Enter the directory path: "); }
while (!directoryExists(directory));
// create Files with random numbers
for (int i = 0; i < Files; i++) {
sprintf(FileNames
[i
], "%s/file_%d.txt", directory
, i
); FILE
*file
= fopen(FileNames
[i
], "w"); if (file == NULL) {
perror("Error creating file"); MPI_Finalize();
return 1;
}
for (int j = 0; j < NumPerFile; j++) {
}
}
MPI_Scatter(FileNames, Files/size *30, MPI_CHAR, recievedFileNames, Files/size *30, MPI_CHAR, 0, MPI_COMM_WORLD);
// handle remaining files
for(int i = Files - Files% size ; i < Files; i++){
localCount += CountOccurrences(x,FileNames[i]);
}
}
localCount = 0;
MPI_Bcast(&x,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Scatter(FileNames, Files/size * 30, MPI_CHAR, recievedFileNames, Files/size * 30, MPI_CHAR, 0, MPI_COMM_WORLD);
for (int i = 0; i < Files/size; i++)
{
printf("%s\n",recievedFileNames
[i
]); localCount += CountOccurrences(x,recievedFileNames[i]);
}
MPI_Reduce(&localCount, &totalCount, 1, MPI_INT, MPI_SUM, 0,MPI_COMM_WORLD);
printf("P%d Total number of occurrences = %d\n",rank
,localCount
);
if (rank == 0)
{
printf("Total number of occurrences in all 100 files = %d\n",totalCount
); }
MPI_Finalize();
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSAibXBpLmgiCiNpbmNsdWRlIDxkaXJlbnQuaD4gLy8gRm9yIG9wZW5kaXIoKSwgcmVhZGRpcigpLCBhbmQgY2xvc2VkaXIoKQoKaW50IGRpcmVjdG9yeUV4aXN0cyhjb25zdCBjaGFyICpwYXRoKSB7CiAgICBESVIgKmRpciA9IG9wZW5kaXIocGF0aCk7CiAgICBpZiAoZGlyKSB7CiAgICAgICAgY2xvc2VkaXIoZGlyKTsKICAgICAgICByZXR1cm4gMTsgCiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAwOyAKICAgIH0KfQoKaW50IENvdW50T2NjdXJyZW5jZXMoaW50IHRhcmdldCwgY29uc3QgY2hhciAqRmlsZU5hbWUpIHsKICAgIEZJTEUgKmZpbGUgPSBmb3BlbihGaWxlTmFtZSwgInIiKTsKICAgIGlmIChmaWxlID09IE5VTEwpIHsKICAgICAgICBwZXJyb3IoIkVycm9yIG9wZW5pbmcgZmlsZSIpOwogICAgICAgIHJldHVybiAtMTsgCiAgICB9CiAgICAKICAgIGludCBjb3VudCA9IDA7CiAgICBpbnQgbnVtOwogICAgd2hpbGUgKGZzY2FuZihmaWxlLCAiJWQiLCAmbnVtKSA9PSAxKSB7CiAgICAgICAgaWYgKG51bSA9PSB0YXJnZXQpIHsKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZjbG9zZShmaWxlKTsKICAgIHJldHVybiBjb3VudDsKfQoKaW50IG1haW4oIGludCBhcmdjLCBjaGFyICoqYXJndiApCnsKICAgIGNvbnN0IGludCAgRmlsZXMgPSAxMDA7CiAgICBjb25zdCBpbnQgTnVtUGVyRmlsZSA9IDEwMDsKICAgIGludCByYW5rLHNpemU7CiAgICBpbnQgeDsKICAgIGNoYXIgRmlsZU5hbWVzW0ZpbGVzXVszMF07CiAgICBjaGFyIHJlY2lldmVkRmlsZU5hbWVzW0ZpbGVzXVszMF07CiAgICBpbnQgbG9jYWxDb3VudCA9IDAsIHRvdGFsQ291bnQgPSAwOwogICAgTVBJX1N0YXR1cyBzdGF0dXM7CgogICAgTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKICAgIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZyYW5rKTsKICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZzaXplKTsKCiAgICBpZihyYW5rID09MCl7CiAgICAgICAgY2hhciBkaXJlY3RvcnlbMzBdOwogICAgICAgIC8vIHRha2UgZGlyZWN0b3J5CiAgICAgICAgZG97CiAgICAgICAgICAgIHByaW50ZigiRW50ZXIgdGhlIGRpcmVjdG9yeSBwYXRoOiAiKTsKICAgICAgICAgICAgc2NhbmYoIiVzIiwgZGlyZWN0b3J5KTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKCFkaXJlY3RvcnlFeGlzdHMoZGlyZWN0b3J5KSk7CgogICAgICAgIC8vIGNyZWF0ZSBGaWxlcyB3aXRoIHJhbmRvbSBudW1iZXJzCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGaWxlczsgaSsrKSB7CiAgICAgICAgICAgIHNwcmludGYoRmlsZU5hbWVzW2ldLCAiJXMvZmlsZV8lZC50eHQiLCBkaXJlY3RvcnksIGkpOwogICAgICAgICAgICBGSUxFICpmaWxlID0gZm9wZW4oRmlsZU5hbWVzW2ldLCAidyIpOwogICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGNyZWF0aW5nIGZpbGUiKTsKICAgICAgICAgICAgICAgIE1QSV9GaW5hbGl6ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOdW1QZXJGaWxlOyBqKyspIHsKICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwgIiVkXG4iLCByYW5kKCkgJSAxMDAgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmY2xvc2UoZmlsZSk7CiAgICAgICAgfQoKICAgICAgICBwcmludGYoIkVudGVyIG51bWJlciB4OiBcbiIpOwogICAgICAgIHNjYW5mKCIlZCIsICZ4KTsKCgogICAgICAgIE1QSV9TY2F0dGVyKEZpbGVOYW1lcywgRmlsZXMvc2l6ZSAqMzAsIE1QSV9DSEFSLCByZWNpZXZlZEZpbGVOYW1lcywgRmlsZXMvc2l6ZSAqMzAsIE1QSV9DSEFSLCAwLCBNUElfQ09NTV9XT1JMRCk7CgogICAgICAgIC8vIGhhbmRsZSByZW1haW5pbmcgZmlsZXMgCiAgICAgICAgZm9yKGludCBpICA9IEZpbGVzIC0gRmlsZXMlIHNpemUgOyBpIDwgRmlsZXM7IGkrKyl7CiAgICAgICAgICAgIGxvY2FsQ291bnQgKz0gQ291bnRPY2N1cnJlbmNlcyh4LEZpbGVOYW1lc1tpXSk7CiAgICAgICAgfQogICAgfQoKICAgIGxvY2FsQ291bnQgPSAwOwogICAgTVBJX0JjYXN0KCZ4LDEsTVBJX0lOVCwwLE1QSV9DT01NX1dPUkxEKTsKCiAgICBNUElfU2NhdHRlcihGaWxlTmFtZXMsIEZpbGVzL3NpemUgKiAzMCwgTVBJX0NIQVIsIHJlY2lldmVkRmlsZU5hbWVzLCBGaWxlcy9zaXplICogMzAsIE1QSV9DSEFSLCAwLCBNUElfQ09NTV9XT1JMRCk7CgogICAgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEZpbGVzL3NpemU7IGkrKykKICAgIHsgICAKICAgICAgICBwcmludGYoIiVzXG4iLHJlY2lldmVkRmlsZU5hbWVzW2ldKTsKICAgICAgICBsb2NhbENvdW50ICs9IENvdW50T2NjdXJyZW5jZXMoeCxyZWNpZXZlZEZpbGVOYW1lc1tpXSk7CiAgICB9CiAgICAKICAgIE1QSV9SZWR1Y2UoJmxvY2FsQ291bnQsICZ0b3RhbENvdW50LCAxLCBNUElfSU5ULCBNUElfU1VNLCAwLE1QSV9DT01NX1dPUkxEKTsKCiAgICBwcmludGYoIlAlZCBUb3RhbCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgPSAlZFxuIixyYW5rLGxvY2FsQ291bnQpOwoKICAgIGlmIChyYW5rID09IDApCiAgICB7CiAgICAgICAgcHJpbnRmKCJUb3RhbCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgaW4gYWxsIDEwMCBmaWxlcyA9ICVkXG4iLHRvdGFsQ291bnQpOwogICAgfQogICAgCgogICAgTVBJX0ZpbmFsaXplKCk7CiAgICByZXR1cm4gMDsKfQ==