#include #include #include #include #include #include "pvm3.h" #include "pvm_lib.h" /* note that not changing this would be an error! */ #define SELF "e_sspmd" #define TIDTAG 17 #define TOKTAG 13 int main(void){ int mytid, me, daddy, numt, i; int nproc = 100, nchild = nproc - 1, tids[nproc]; long start_time = time(NULL); mytid = pvm_error_check(pvm_mytid(), "pvm_mytid:1"); //note we don't error check this next one! daddy = pvm_parent(); if(daddy == PvmNoParent){ /* parent code */ me = 0; tids[0] = mytid; printf("i'm daddy with tid %d\n", tids[0]); printf("spawning at t = %ld\n", time(NULL) - start_time); numt = pvm_spawn(SELF, NULL, 0, "", nchild, &tids[1]); if(numt < nchild){ printf("Aborting. Error codes are:\n"); for(i = numt ; i < nchild ; i++) { printf("TID %d %s\n", i, pvmErrorCode2String(tids[i])); } for(i = 1; i < numt; i++){ pvm_error_check(pvm_kill(tids[i]), "pvm_kill:2"); } pvm_exit(); exit(EXIT_FAILURE); } pvm_error_check(pvm_initsend(PvmDataDefault), "pvm_initsend:3"); pvm_error_check(pvm_pkint(&nproc, 1, 1), "pvm_pkint:4"); pvm_error_check(pvm_pkint(tids, nproc, 1), "pvm_pkint:5"); pvm_error_check(pvm_pklong(&start_time, 1, 1), "pvm_pklong:6"); pvm_error_check(pvm_mcast(&tids[1], nchild, TIDTAG), "pvm_mcast:7"); } else { /* child code */ pvm_error_check(pvm_recv(daddy, TIDTAG), "pvm_recv:8"); pvm_error_check(pvm_upkint(&nproc, 1, 1), "pvm_upkint:9"); pvm_error_check(pvm_upkint(tids, nproc, 1), "pvm_upkint:10"); pvm_error_check(pvm_upklong(&start_time, 1, 1), "pvm_upklong:11"); /* Determine which slave I am (1 -- nproc-1) */ for(i = 1; i < nproc ; i++) if(mytid == tids[i]){ me = i; break; } printf("i'm child %d with tid %d at time = %ld\n", i, tids[i], time(NULL) - start_time); } /* ring code */ { int token = 58; int dst = (me == (nproc - 1)) ? 0 : me + 1; int src = (me == 0) ? (nproc - 1) : me - 1; if(me == 0){ pvm_error_check(pvm_initsend(PvmDataDefault), "pvm_initsend:12"); printf("sending token around the ring at time = %ld\n", time(NULL) - start_time); pvm_error_check(pvm_pkint(&token, 1, 1), "pvm_pkint:13"); pvm_error_check(pvm_send(tids[dst], TOKTAG), "pvm_send:14"); pvm_error_check(pvm_recv(tids[src], TOKTAG), "pvm_recv:15"); printf("token arrived back safely at time = %ld\n", time(NULL) - start_time); } else { pvm_error_check(pvm_recv(tids[src], TOKTAG), "pvm_recv:16"); pvm_error_check(pvm_upkint(&token, 1, 1), "pvm_upkint:17"); printf("i'm child %d and i got token %d at time = %ld\n", i, token, time(NULL) - start_time); // sleep(1); pvm_error_check(pvm_initsend(PvmDataDefault), "pvm_initsend:18"); pvm_error_check(pvm_pkint(&token, 1, 1), "pvm_pkint:19"); pvm_error_check(pvm_send(tids[dst],TOKTAG), "pvm_send:20"); } pvm_exit(); exit(EXIT_SUCCESS); } }