Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<string.h>
- #include<mpi.h>
- int main(void){
- MPI_Init(NULL,NULL);
- int proc_rank;
- MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
- int proc_size;
- MPI_Comm_size(MPI_COMM_WORLD, &proc_size);
- if (proc_rank == 0) { //Chteniya proizvoditsya v processe 0 i otpravlyaetsya toje s etogo
- int c;
- FILE *file;
- char a[10000];
- int len = 0;
- file = fopen("test.txt", "r"); //Dlya chteniya s faila
- if (file) {
- while ((c = getc(file)) != EOF) // poka not end of file chitaem kajdyi simvol po ocheredi i kladem v massiv
- a[len++] = c;
- fclose(file);
- }
- int left = 0; //nachalo sleduiwego bloka teksta(charovski massiv a[])
- int rem = len % (proc_size-1); //nam nujno podelit' tekst rovno dlya kajdogo processa
- for(int i = 1; i < proc_size; i++){ // vot zdes' uje otpravlyaem kajdyi block i
- int block_size = (len / (proc_size-1)); //dlina dlya tekuwego bloka [7,7,7,6] rem = 3
- if (rem > 0) { block_size++; rem--; } //nekotorye dliny ne delyatsya rovno kak 27 na 4 processa naprimer i 3 ostavwiesya my toje doljny razdelit' po blokam
- int right = left + block_size - 1; //konec tekuwego bloka
- char temp[block_size]; //copyruem block v a[left,right] na drugoi massiv temp[0,right-left+1]
- for(int j = left; j < right; j++) temp[j-left] = a[j];
- MPI_Send(&block_size, 1, MPI_INT, i, 0, MPI_COMM_WORLD); //snachala otpravlyaem dlinu bloka chtob tam v drugom processe vstretil
- MPI_Send(temp, block_size+1, MPI_CHAR, i, 1, MPI_COMM_WORLD); //teper' uje sam blok
- MPI_Recv(temp,block_size+1, MPI_CHAR, i, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //zdes' uje prinimaem reversed block
- for(int j = left; j < right; j++) a[j] = temp[j-left]; // i stavim obratno na mesto v a[]
- left = right + 1; // uzhe nachalo sleduwego bloka
- }
- FILE *fp = fopen("reversed.txt", "ab");
- if (fp != NULL)
- {
- fputs(data, fp);// Vyvod na file
- fclose(fp);
- }
- } else if (proc_rank != 0) {
- int length;
- MPI_Recv(&length, 1 , MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //vot tut process i prinimaet dlinu bloka kotoryi vot vot pridet
- char str[length];
- MPI_Recv(str,length+1, MPI_CHAR, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // i vidite my doljny uzhe vstretit' s pomow'u dliny(vtoroi parameter)
- int i = 0;
- int j = length-1; //Tut proishodit reverse
- while (i < j) {
- temp = str[i];
- str[i] = str[j];
- str[j] = temp;
- i++;
- j--;
- }
- MPI_Send(str, length+1, MPI_CHAR, 0, 2, MPI_COMM_WORLD); //i otpravlyaetsya obratno
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement