// send command, including optional parameters if sendBuffer != 0 void send_command(uint8_t cmd, const uint8_t *send_buffer, uint8_t send_length, uint8_t response_length) { while (!RADIO_READY); // always wait for radio to be ready (CTS) before sending next command SPI_ON; spi_transfer(cmd); // transmit command if (send_length && send_buffer) { // if there are parameters to send, do so uint8_t c = 0; while (c != send_length) { spi_transfer(send_buffer[c]); // transmit byte c++; } } SPI_OFF; if (response_length) { while (!RADIO_READY); // wait for radio to be ready before retrieving response while (receive_result(response_length) == 0); // wait for valid response } return; }
void pvmica(doublereal *data, doublereal *weights, doublereal *sphere, doublereal *eigv, integer chans, integer ncomps, integer frames, integer epochs, int *window, doublereal *bias, integer *signs, char **fnames) { struct pvmhostinfo *hinfo; int i, j, datasize, maxep, maxfr, segs, speed, spwnd = 0, id = 0; int *tids, tid, nhost, narch, nproc = 0, ntask = 0, last = 0; char *name; FILE *fids[3]; integer **srec; doublereal **wrec, **brec, *basedata, *windata, *prjdata, deflr = lrate; tresult result; tassign assign; /* pvm_catchout(stdout);*/ pvm_config(&nhost,&narch,&hinfo); for (i=0 ; i<nhost ; i++) nproc += speed2proc(hinfo[i].hi_speed); basedata = (doublereal*)malloc(ncomps*epochs*window[BASELINE]*sizeof(doublereal)); baseline(data,basedata,ncomps,frames,epochs,window); runica(basedata,weights,ncomps,1,window[BASELINE]*epochs,bias,signs); free(basedata); assign.weights = weights; assign.chans = ncomps; assign.frames = window[FRAMEWINDOW]; assign.epochs = window[EPOCHWINDOW]; assign.bias = (int)(bias!=NULL); assign.signs = (int)(signs!=NULL); assign.extended = extended; assign.extblocks = extblocks; assign.pdfsize = pdfsize; assign.nsub = nsub; assign.verbose = verbose; assign.block = block; assign.maxsteps = maxsteps; assign.lrate = deflr; assign.annealstep = annealstep; assign.annealdeg = annealdeg; assign.nochange = nochange; assign.momentum = momentum; datasize = window[FRAMEWINDOW] * window[EPOCHWINDOW] * ncomps; windata = (doublereal*)malloc(datasize*sizeof(doublereal)); prjdata = (doublereal*)malloc(datasize*sizeof(doublereal)); maxep = (epochs-window[EPOCHWINDOW])/window[EPOCHSTEP] + 1; maxfr = (frames-window[FRAMEWINDOW])/window[FRAMESTEP] + 1; segs = maxep*maxfr; if (segs > nproc) { tids = (int*)malloc(nproc*sizeof(int)); for (i=0 ; i<nhost ; i++) { name = hinfo[i].hi_name; speed = hinfo[i].hi_speed; spwnd = pvm_spawn(SPAWN_ICA,NULL,1,name,speed2proc(speed),&tids[ntask]); if (spwnd <= 0) error("Failed to spawn processes"); ntask += spwnd; } } else { tids = (int*)malloc(segs*sizeof(int)); spwnd += pvm_spawn(SPAWN_ICA,NULL,0,"",segs,tids); if (spwnd <= 0) error("Failed to spawn processes"); ntask += spwnd; } for (i=0,j=0 ; i<ntask ; i++,j+=2,id++) { if (j >= ntask) j=1; assign.id = id; assign.data = extract(data,windata,(int)ncomps,(int)frames,(int)epochs,(int)id,window); send_assign(tids[j],&assign); } wrec = (doublereal**)malloc(segs*sizeof(doublereal*)); brec = (doublereal**)malloc(segs*sizeof(doublereal*)); srec = (integer**)malloc(segs*sizeof(integer*)); for (i=0 ; i<segs ; i++) { wrec[i] = NULL; brec[i] = NULL; srec[i] = NULL; } for (i=0 ; i<3 ; i++) fids[i] = NULL; if (fnames[0] != NULL) fids[0] = fopen(fnames[0],"wb"); if (fnames[1] != NULL) fids[1] = fopen(fnames[1],"wb"); if (fnames[2] != NULL) fids[2] = fopen(fnames[2],"wt"); for (i=0 ; i<segs ; i++) { tid = receive_result(&result); printf("Received id %d\n",result.id); wrec[result.id] = result.weights; brec[result.id] = result.bias; srec[result.id] = result.signs; if (ntask < segs) { assign.id = id; assign.data = extract(data,windata,(int)ncomps,(int)frames,(int)epochs,(int)id,window); send_assign(tid,&assign); ntask++; id++; } else { send_kill(tid); } datasize = window[FRAMEWINDOW] * window[EPOCHWINDOW]; extract(data,windata,(int)ncomps,(int)frames,(int)epochs,(int)result.id,window); geproj(windata,result.weights,(integer)ncomps,(integer)datasize,prjdata); if (eigv) varsort(prjdata,result.weights,sphere,&eigv[chans*(chans-ncomps)],result.bias,result.signs,(integer)ncomps,(integer)datasize,(integer)chans); else varsort(prjdata,result.weights,sphere,NULL,result.bias,result.signs,(integer)ncomps,(integer)datasize,(integer)chans); while (last<segs && wrec[last]!=NULL) { if (fids[0]!=NULL && wrec[last]!=NULL) fbc_matwrite(fids[0],chans*ncomps,wrec[last]); if (fids[1]!=NULL && brec[last]!=NULL) fbc_matwrite(fids[1],ncomps,brec[last]); if (fids[2]!=NULL && srec[last]!=NULL) iac_matwrite(fids[2],ncomps,srec[last]); if (wrec[last] != NULL) free(wrec[last]); if (brec[last] != NULL) free(brec[last]); if (srec[last] != NULL) free(srec[last]); last++; } } for (i=0 ; i<3 ; i++) if (fids[i] != NULL) fclose(fids[i]); if (wrec != NULL) free(wrec); if (brec != NULL) free(brec); if (srec != NULL) free(srec); if (windata != NULL) free(windata); if (prjdata != NULL) free(prjdata); if (tids != NULL) free(tids); }
void mpiica(doublereal *data, doublereal *weights, doublereal *sphere, doublereal *eigv, integer chans, integer ncomps, integer frames, integer epochs, int *window, doublereal *bias, integer *signs, char **fnames) { int i, j, datasize, maxep, maxfr, segs, speed, spwnd = 0, id = 0; int tid, nproc, ntask, last = 0; char *name; FILE *fids[3]; integer **srec; doublereal **wrec, **brec, *basedata, *windata, *prjdata, deflr = lrate; tresult result; tassign assign; MPI_Comm_size(MPI_COMM_WORLD,&nproc); basedata = (doublereal*)malloc(ncomps*epochs*window[BASELINE]*sizeof(doublereal)); baseline(data,basedata,ncomps,frames,epochs,window); runica(basedata,weights,ncomps,1,window[BASELINE]*epochs,bias,signs); free(basedata); assign.weights = weights; assign.chans = ncomps; assign.frames = window[FRAMEWINDOW]; assign.epochs = window[EPOCHWINDOW]; assign.bias = (int)(bias!=NULL); assign.signs = (int)(signs!=NULL); assign.extended = extended; assign.extblocks = extblocks; assign.pdfsize = pdfsize; assign.nsub = nsub; assign.verbose = verbose; assign.block = block; assign.maxsteps = maxsteps; assign.lrate = deflr; assign.annealstep = annealstep; assign.annealdeg = annealdeg; assign.nochange = nochange; assign.momentum = momentum; datasize = window[FRAMEWINDOW] * window[EPOCHWINDOW] * ncomps; windata = (doublereal*)malloc(datasize*sizeof(doublereal)); prjdata = (doublereal*)malloc(datasize*sizeof(doublereal)); maxep = (epochs-window[EPOCHWINDOW])/window[EPOCHSTEP] + 1; maxfr = (frames-window[FRAMEWINDOW])/window[FRAMESTEP] + 1; segs = maxep*maxfr; for (i=1 ; i<nproc ; i++,id++) { assign.id = id; assign.data = extract(data,windata,(int)ncomps,(int)frames,(int)epochs,(int)id,window); send_assign(i,&assign); } ntask = nproc-1; wrec = (doublereal**)malloc(segs*sizeof(doublereal*)); brec = (doublereal**)malloc(segs*sizeof(doublereal*)); srec = (integer**)malloc(segs*sizeof(integer*)); for (i=0 ; i<segs ; i++) { wrec[i] = NULL; brec[i] = NULL; srec[i] = NULL; } for (i=0 ; i<3 ; i++) fids[i] = NULL; if (fnames[0] != NULL) fids[0] = fopen(fnames[0],"wb"); if (fnames[1] != NULL) fids[1] = fopen(fnames[1],"wb"); if (fnames[2] != NULL) fids[2] = fopen(fnames[2],"wt"); for (i=0 ; i<segs ; i++) { tid = receive_result(&result); printf("Received id %d\n",result.id); wrec[result.id] = result.weights; brec[result.id] = result.bias; srec[result.id] = result.signs; if (ntask < segs) { assign.id = id; assign.data = extract(data,windata,(int)ncomps,(int)frames,(int)epochs,(int)id,window); send_assign(tid,&assign); ntask++; id++; } datasize = window[FRAMEWINDOW] * window[EPOCHWINDOW]; extract(data,windata,(int)ncomps,(int)frames,(int)epochs,(int)result.id,window); geproj(windata,result.weights,(integer)ncomps,(integer)datasize,prjdata); if (eigv) varsort(prjdata,result.weights,sphere,&eigv[chans*(chans-ncomps)],result.bias,result.signs,(integer)ncomps,(integer)datasize,(integer)chans); else varsort(prjdata,result.weights,sphere,NULL,result.bias,result.signs,(integer)ncomps,(integer)datasize,(integer)chans); while (last<segs && wrec[last]!=NULL) { if (fids[0]!=NULL && wrec[last]!=NULL) fbc_matwrite(fids[0],chans*ncomps,wrec[last]); if (fids[1]!=NULL && brec[last]!=NULL) fbc_matwrite(fids[1],ncomps,brec[last]); if (fids[2]!=NULL && srec[last]!=NULL) iac_matwrite(fids[2],ncomps,srec[last]); if (wrec[last] != NULL) free(wrec[last]); if (brec[last] != NULL) free(brec[last]); if (srec[last] != NULL) free(srec[last]); last++; } } for (i=0 ; i<3 ; i++) if (fids[i] != NULL) fclose(fids[i]); if (wrec != NULL) free(wrec); if (brec != NULL) free(brec); if (srec != NULL) free(srec); if (windata != NULL) free(windata); if (prjdata != NULL) free(prjdata); }