#include #include #include #include #include #include "pvm3.h" #define SELF "sspmd" #define TIDTAG 17 #define TOKTAG 13 void pvm_bail(){ pvm_exit(); exit(EXIT_FAILURE); } #define PVM_ERROR_CHECK(X, Y) \ { int _err_rtn_;\ if((_err_rtn_ = X) < 0){\ fprintf(stderr, "PVM error code %d: %s failed -- aborting\n", _err_rtn_, #X);\ (Y); } } int main(void){ int mytid, me, daddy, numt, i; int nproc = 100, nchild = nproc - 1, tids[nproc]; long start_time = time(NULL); PVM_ERROR_CHECK((mytid = pvm_mytid()), pvm_bail()); 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 %d\n", i, tids[i]); } for(i = 1; i < numt; i++){ pvm_kill(tids[i]); } pvm_exit(); exit(EXIT_FAILURE); } PVM_ERROR_CHECK(pvm_initsend(PvmDataDefault), pvm_bail()); PVM_ERROR_CHECK(pvm_pkint(&nproc, 1, 1), pvm_bail()); PVM_ERROR_CHECK(pvm_pkint(tids, nproc, 1), pvm_bail()); PVM_ERROR_CHECK(pvm_pklong(&start_time, 1, 1), pvm_bail()); PVM_ERROR_CHECK(pvm_mcast(&tids[1], nchild, TIDTAG), pvm_bail()); } else { /* child code */ PVM_ERROR_CHECK(pvm_recv(daddy, TIDTAG), pvm_bail()); PVM_ERROR_CHECK(pvm_upkint(&nproc, 1, 1), pvm_bail()); PVM_ERROR_CHECK(pvm_upkint(tids, nproc, 1), pvm_bail()); PVM_ERROR_CHECK(pvm_upklong(&start_time, 1, 1), pvm_bail()); /* 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_bail()); printf("sending token around the ring at time = %ld\n", time(NULL) - start_time); PVM_ERROR_CHECK(pvm_pkint(&token, 1, 1), pvm_bail()); PVM_ERROR_CHECK(pvm_send(tids[dst], TOKTAG), pvm_bail()); PVM_ERROR_CHECK(pvm_recv(tids[src], TOKTAG), pvm_bail()); printf("token arrived back safely at time = %ld\n", time(NULL) - start_time); } else { PVM_ERROR_CHECK(pvm_recv(tids[src], TOKTAG), pvm_bail()); PVM_ERROR_CHECK(pvm_upkint(&token, 1, 1), pvm_bail()); 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_bail()); PVM_ERROR_CHECK(pvm_pkint(&token, 1, 1), pvm_bail()); PVM_ERROR_CHECK(pvm_send(tids[dst],TOKTAG), pvm_bail()); } pvm_exit(); exit(EXIT_SUCCESS); } }