Паралельні обчислення з використанням MPI
Контрольная работа - Компьютеры, программирование
Другие контрольные работы по предмету Компьютеры, программирование
>
printf("[%d] Proc recv %s:: %s\n",myrank,acc_name,acc_pass);fflush(stdout);
int result = do_decrypt_pass(myrank);// Розшифровуємо пароль
switch (result) // Відсилаємо результат
{
case MSG_SUCCESS:
MPI_Ssend(&result, 1, MPI_INT, 0, TAG_MSG, MPI_COMM_WORLD);
MPI_Ssend(&acc_name_len, 1, MPI_INT, 0,TAG_SEND_NAMELEN, MPI_COMM_WORLD);
MPI_Ssend(&acc_pass_len, 1, MPI_INT, 0,TAG_SEND_PASSLEN, MPI_COMM_WORLD);
MPI_Ssend(&acc_name, acc_name_len, MPI_CHAR, 0, TAG_SEND_NAME, MPI_COMM_WORLD);
MPI_Ssend(&acc_pass, acc_pass_len, MPI_CHAR, 0, TAG_SEND_PASS, MPI_COMM_WORLD);
break;
case MSG_FAILURE:
MPI_Ssend(&result, 1, MPI_INT, 0, TAG_MSG, MPI_COMM_WORLD);
MPI_Ssend(&acc_name_len, 1, MPI_INT, 0,TAG_SEND_NAMELEN, MPI_COMM_WORLD);
MPI_Ssend(&acc_name, acc_name_len, MPI_CHAR, 0, TAG_SEND_NAME, MPI_COMM_WORLD);
break;
}
}
printf ("[%d] Process exits\n",myrank);fflush(stdout);
}
MPI_Finalize();
return 0;
}
int do_decrypt_pass(int param)
{
if (param % 2 == 0) return 1;
else return 0;
}
===== Example5.cpp =====
У цьому прикладі головний процес (master) займається керуванням іншими робітниками процесами (slave), а також відає постачанням і збором інформації. Підпрограма
MPI_Probe (int source, int tag, MPI_Comm comm, MPI_Status *status)
перевіряє наявність повідомлень, готових до прийому. Її варіант, неблокуючий - MPI_Iprobe(int source, int tag, MPI_Comm comm, int *flag, MPI_Status *status) - якщо повідомлення вже надійшло і може бути прийнято, повертається значення прапора істина. Інакше (повідомлення надійшло нецілком) неправду. Виклик процедури, що блокуючий, MPI_Probe з параметрами MPI_ANY_SOURCE і MPI_ANY_TAG зупиняє виконання майстра-процесу до надходження якого-небудь повідомлення, реалізуючи в рамках процесу модель подій. Далі в залежності від повідомлення, що надійшло, майстер-процес або приймає результати (успіх/невдача) з висновком відповідного повідомлення, або видає робочому процесу черговий набір інформації інформації (логін-пароль). Якщо всі паролі вже роздані робочому процесу посилається сигнал BREAK. Висновок приклада 5: Example5 output (np = 5)
Initializing
[2] Waiting
<<< Proc 2 returned 2
>>> Feeding apc:: 12345 to proc 2
[3] Waiting
<<< Proc 3 returned 2
>>> Feeding admin:: aa5632 to proc 3
[2] Proc recv apc:: 12345
[1] Waiting
<<< Proc 1 returned 2
>>> Feeding bionicman:: 3995d to proc 1
[3] Proc recv admin:: aa5632
[4] Waiting
<<< Proc 4 returned 2
>>> Feeding root:: *** to proc 4
[1] Proc recv bionicman:: 3995d
<<< Proc 2 returned 1
[4] Proc recv root:: ***
[+] Proc 2 got: apc:: 12345
<<< Proc 3 returned 0
[-] Proc 3 couldnt break: admin in set limits
<<< Proc 1 returned 0
[-] Proc 1 couldnt break: bionicman in set limits
<<< Proc 4 returned 1
[+] Proc 4 got: root:: ***
[2] Waiting
<<< Proc 2 returned 2
>>> Feeding vasya:: 1234nasja to proc 2
[3] Waiting
<<< Proc 3 returned 2
>>> Feeding jmanderley:: 1a2_+3 to proc 3
[2] Proc recv vasya:: 1234nasja
[1] Waiting
<<< Proc 1 returned 2
>>> Feeding man:: aa6321 to proc 1
[3] Proc recv jmanderley:: 1a2_+3
[4] Waiting
<<< Proc 4 returned 2
>>> Feeding demeter:: 3ss9951 to proc 4
[1] Proc recv man:: aa6321
<<< Proc 2 returned 1
[4] Proc recv demeter:: 3ss9951
[+] Proc 2 got: vasya:: 1234nasja
<<< Proc 3 returned 0
[-] Proc 3 couldnt break: jmanderley in set limits
<<< Proc 1 returned 0
[-] Proc 1 couldnt break: man in set limits
<<< Proc 4 returned 1
[+] Proc 4 got: demeter:: 3ss9951
[2] Waiting
<<< Proc 2 returned 2
>>> Feeding wheeljack:: *3472364%s to proc 2
[3] Waiting
<<< Proc 3 returned 2
[2] Proc recv wheeljack:: *3472364%s
>>> Feeding dalain:: 4nas5t to proc 3
[1] Waiting
<<< Proc 1 returned 2
[3] Proc recv dalain:: 4nas5t
>>> Feeding nobode:: * to proc 1
[4] Waiting
<<< Proc 4 returned 2
[1] Proc recv nobode:: *
>>> Feeding lamer:: password to proc 4
<<< Proc 2 returned 1
[4] Proc recv lamer:: password
[+] Proc 2 got: wheeljack:: *3472364%s
<<< Proc 3 returned 0
[-] Proc 3 couldnt break: dalain in set limits
<<< Proc 1 returned 0
[-] Proc 1 couldnt break: nobode in set limits
<<< Proc 4 returned 1
[+] Proc 4 got: lamer:: password
[2] Waiting
<<< Proc 2 returned 2
>>> Feeding cewl:: asfuh$Kjsfhdf&34kd to proc 2
[3] Waiting
<<< Proc 3 returned 2
>>> Feeding hacker:: to proc 3
[2] Proc recv cewl:: asfuh$Kjsfhdf&34kd
[1] Waiting
<<< Proc 1 returned 2
>>> Feeding LASTONE:: LASTPASS to proc 1
[3] Proc recv hacker::
[4] Waiting
<<< Proc 4 returned 2
<<< Proc 2 returned 1
[1] Proc recv LASTONE:: LASTPASS
[4] BREAK received
[4] Process exits
[+] Proc 2 got: cewl:: asfuh$Kjsfhdf&34kd
<<< Proc 3 returned 0
[-] Proc 3 couldnt break: hacker in set limits
<<< Proc 1 returned 0
[-] Proc 1 couldnt break: LASTONE in set limits
[2] Waiting
<<< Proc 2 returned 2
[3] Waiting
[2] BREAK received
[2] Process exits
<<< Proc 3 returned 2
[1] Waiting
[3] BREAK received
[3] Process exits
<<< Proc 1 returned 2
[0] Process exits
[1] BREAK received
[1] Process exits
3.4 Паралельне введення-виведення.
Останній приклад 6 показує, можна було вирішити ту ж задачу простіше:
===== Example6.cpp =====
#include
#include
#include
int do_decrypt_pass(int param)
{
if (param % 2 == 0) return 1;
else return 0;
}
int main(int argc, char* argv[])
{
char in_line[256],acc_name[256],acc_pass[256];
FILE * file_in;
int myrank, size;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
file_in = fopen("pass.txt","r");
printf("[%d]: file open\n",myrank); fflush(stdout);
char* p;
for (int i=0; i<= myrank;i++) fgets(in_line,256,file_in);
while (!feof(file_in))
{
if (p = strtok(in_line,"::")) sprintf(acc_name,"%s",p);
if (p = strtok(NULL,"::")) sprintf(acc_pass,"%s",p);
printf("[%d] Read: %s:: %s\n",myrank,acc_name,acc_pass); fflush(stdout);
int result = do_decrypt_pass(myrank);
if (result ==1) {printf ("[+] Proc %d got: %s:: %s\n",myrank,acc_name,acc_pass);fflush(stdout);}
else {printf ("[-] Proc %d couldnt break: %s in set limits\n",myrank,acc_name);fflush(stdout);}
for (int i=0; i< size;i++) fgets(in_line,256,file_in);
}
printf ("[%d]: Process exits\n",myrank);fflush(stdout);
MPI_Finalize();
return 0;
}
===== Example6.cpp =====
У коді немає нічого нового, тому розбір його залишаємо на самостійне проробку.
Example6 output (np =)
[0]: file open
[0] Read: apc:: 12345
[1]: file open
[1] Read: admin:: aa5632
[-] Proc 1 couldnt break: admin in set limits
[1] Read: vasya:: 1234nasja
[+] Proc 0 got: apc:: 12345
[0] Read: root:: ***
[+] Proc 0 got: root:: ***
[0] Read: man:: aa6321
[-] Proc 1 couldnt break: vasya in set limits
[1] Read: demeter:: 3ss9951
[2]: file open
[2] Read: bionicman:: 3995d
[+] Proc 2 got: bionicman:: 3995d
[2] Read: jmanderley:: 1a2