seanhalle@0: /* seanhalle@0: * Copyright 2009 OpenSourceResearchInstitute.org seanhalle@0: * Licensed under GNU General Public License version 2 seanhalle@0: * seanhalle@0: * Author: seanhalle@yahoo.com seanhalle@0: * seanhalle@0: */ seanhalle@0: seanhalle@0: seanhalle@0: #include seanhalle@0: #include seanhalle@0: #include "DKU__Test_App.h" seanhalle@0: seanhalle@0: /*Bare smoke test of DKU wrapper library functions. seanhalle@0: * Create one DKU instance, with a dummy kernel seanhalle@0: * Bare bones divider and undivider seanhalle@0: * simple root piece maker seanhalle@0: * dummy serial kernel seanhalle@0: */ seanhalle@0: seanhalle@0: int seanhalle@0: square( int x ) seanhalle@0: { return x*x; seanhalle@0: } seanhalle@0: seanhalle@0: seanhalle@0: DKUPiece * seanhalle@0: rootPieceMakerFn( void *params, DKUInstance *dkuInstance ) seanhalle@0: { DKUPiece *rootPiece; seanhalle@0: seanhalle@0: rootPiece = PRServ__DKU_make_empty_DKU_piece(); seanhalle@0: rootPiece->parent = NULL; seanhalle@0: rootPiece->payload = params; seanhalle@0: rootPiece->dkuInstance = dkuInstance; seanhalle@0: seanhalle@0: return rootPiece; seanhalle@0: } seanhalle@0: seanhalle@0: DKUPiece * seanhalle@0: make_root_dku_piece_for_test_inst( int32 *data, int32 size, seanhalle@0: DKUInstance *dkuInstance ) seanhalle@0: { DKUPiece *rootPiece; seanhalle@0: TestAppStruct *params; seanhalle@0: seanhalle@0: params = PR__malloc( sizeof(TestAppStruct) ); seanhalle@0: params->startIter = 0; seanhalle@0: params->endIter = size-1; seanhalle@0: params->data = data; seanhalle@0: params->size = size; seanhalle@0: rootPiece = (*(dkuInstance->rootPieceMaker))( params, dkuInstance ); seanhalle@0: return rootPiece; seanhalle@0: } seanhalle@0: seanhalle@0: seanhalle@0: void seanhalle@0: kernelFn( void *_params, SlaveVP *animVP ) seanhalle@0: { int32 i; seanhalle@0: DKUPiece *piece = (DKUPiece *)_params; seanhalle@0: TestAppStruct *params = (TestAppStruct *)piece->payload; seanhalle@0: int32 *data = params->data; seanhalle@0: seanhalle@0: DEBUG__printf(dbgAppFlow, "Kernel %d", params->startIter); seanhalle@0: seanhalle@0: for( i=params->startIter; i <= params->endIter; ++i ) seanhalle@0: { data[i] = square(i); seanhalle@0: } seanhalle@0: PRServ__DKU_end_kernel( piece, animVP ); seanhalle@0: } seanhalle@0: seanhalle@0: seanhalle@0: /*Serial kernel is called with bare app-defined struct, not DKUPiece seanhalle@0: */ seanhalle@0: void seanhalle@0: serialKernelFn( void *_params, SlaveVP *animVP ) seanhalle@0: { int32 i; seanhalle@0: TestAppStruct *params = (TestAppStruct *)_params; seanhalle@0: int32 *data = params->data; seanhalle@0: seanhalle@0: DEBUG__printf(dbgAppFlow, "SerialKernel %d", params->startIter); seanhalle@0: seanhalle@0: for( i=params->startIter; i < params->endIter; ++i ) seanhalle@0: { data[i] = square(i); seanhalle@0: } seanhalle@0: PRServ__DKU_end_serial_kernel( animVP ); seanhalle@0: } seanhalle@0: seanhalle@0: void seanhalle@0: dividerFn( DKUPiece *pieceToDivide ) seanhalle@0: { seanhalle@0: int32 idx, childIdx, numChildren, size, *data; seanhalle@0: DKUPiece *childPiece, **childrenArray; seanhalle@0: TestAppStruct *params; seanhalle@0: DEBUG__printf(dbgAppFlow, "divider %p", pieceToDivide) seanhalle@0: seanhalle@0: numChildren = pieceToDivide->numChildren; seanhalle@0: childrenArray = PR__malloc( numChildren * sizeof(DKUPiece *) ); seanhalle@0: size = ((TestAppStruct*)pieceToDivide->payload)->size; seanhalle@0: data = ((TestAppStruct*)pieceToDivide->payload)->data; seanhalle@0: int chunkSize = size/numChildren; //for portability, lang would choose this dynamically at run time seanhalle@0: //note: should do processing to catch too small a chunksize and deal w/it seanhalle@0: for( childIdx = 0; childIdx < numChildren; childIdx++ ) seanhalle@0: { params = PR__malloc(sizeof(TestAppStruct)); //these define work the task performs seanhalle@0: idx = childIdx * chunkSize; seanhalle@0: params->startIter = idx; seanhalle@0: params->endIter = idx + chunkSize -1; seanhalle@0: params->data = data; seanhalle@0: params->size = size; seanhalle@0: childPiece = PRServ__DKU_make_child_piece_from( pieceToDivide ); seanhalle@0: childPiece->payload = params; seanhalle@0: childrenArray[childIdx] = childPiece; seanhalle@0: } seanhalle@0: params->endIter = size -1; //catch truncation error from chunkSize calc seanhalle@0: seanhalle@0: pieceToDivide->children = childrenArray; seanhalle@0: } seanhalle@0: seanhalle@0: void undividerFn( DKUPiece *piece ) seanhalle@0: { seanhalle@0: //DEBUG__printf(dbgAppFlow, "Undivider %p", piece) seanhalle@0: //nothing to do -- request handler does counting of completions seanhalle@0: } seanhalle@0: