annotate DKU_Fns.c @ 0:efca8e7ec576

initial add -- working version
author Sean Halle <seanhalle@yahoo.com>
date Tue, 24 Sep 2013 08:08:18 -0700
parents
children
rev   line source
seanhalle@0 1 /*
seanhalle@0 2 * Copyright 2009 OpenSourceResearchInstitute.org
seanhalle@0 3 * Licensed under GNU General Public License version 2
seanhalle@0 4 *
seanhalle@0 5 * Author: seanhalle@yahoo.com
seanhalle@0 6 *
seanhalle@0 7 */
seanhalle@0 8
seanhalle@0 9
seanhalle@0 10 #include <math.h>
seanhalle@0 11 #include <string.h>
seanhalle@0 12 #include "DKU__Test_App.h"
seanhalle@0 13
seanhalle@0 14 /*Bare smoke test of DKU wrapper library functions.
seanhalle@0 15 * Create one DKU instance, with a dummy kernel
seanhalle@0 16 * Bare bones divider and undivider
seanhalle@0 17 * simple root piece maker
seanhalle@0 18 * dummy serial kernel
seanhalle@0 19 */
seanhalle@0 20
seanhalle@0 21 int
seanhalle@0 22 square( int x )
seanhalle@0 23 { return x*x;
seanhalle@0 24 }
seanhalle@0 25
seanhalle@0 26
seanhalle@0 27 DKUPiece *
seanhalle@0 28 rootPieceMakerFn( void *params, DKUInstance *dkuInstance )
seanhalle@0 29 { DKUPiece *rootPiece;
seanhalle@0 30
seanhalle@0 31 rootPiece = PRServ__DKU_make_empty_DKU_piece();
seanhalle@0 32 rootPiece->parent = NULL;
seanhalle@0 33 rootPiece->payload = params;
seanhalle@0 34 rootPiece->dkuInstance = dkuInstance;
seanhalle@0 35
seanhalle@0 36 return rootPiece;
seanhalle@0 37 }
seanhalle@0 38
seanhalle@0 39 DKUPiece *
seanhalle@0 40 make_root_dku_piece_for_test_inst( int32 *data, int32 size,
seanhalle@0 41 DKUInstance *dkuInstance )
seanhalle@0 42 { DKUPiece *rootPiece;
seanhalle@0 43 TestAppStruct *params;
seanhalle@0 44
seanhalle@0 45 params = PR__malloc( sizeof(TestAppStruct) );
seanhalle@0 46 params->startIter = 0;
seanhalle@0 47 params->endIter = size-1;
seanhalle@0 48 params->data = data;
seanhalle@0 49 params->size = size;
seanhalle@0 50 rootPiece = (*(dkuInstance->rootPieceMaker))( params, dkuInstance );
seanhalle@0 51 return rootPiece;
seanhalle@0 52 }
seanhalle@0 53
seanhalle@0 54
seanhalle@0 55 void
seanhalle@0 56 kernelFn( void *_params, SlaveVP *animVP )
seanhalle@0 57 { int32 i;
seanhalle@0 58 DKUPiece *piece = (DKUPiece *)_params;
seanhalle@0 59 TestAppStruct *params = (TestAppStruct *)piece->payload;
seanhalle@0 60 int32 *data = params->data;
seanhalle@0 61
seanhalle@0 62 DEBUG__printf(dbgAppFlow, "Kernel %d", params->startIter);
seanhalle@0 63
seanhalle@0 64 for( i=params->startIter; i <= params->endIter; ++i )
seanhalle@0 65 { data[i] = square(i);
seanhalle@0 66 }
seanhalle@0 67 PRServ__DKU_end_kernel( piece, animVP );
seanhalle@0 68 }
seanhalle@0 69
seanhalle@0 70
seanhalle@0 71 /*Serial kernel is called with bare app-defined struct, not DKUPiece
seanhalle@0 72 */
seanhalle@0 73 void
seanhalle@0 74 serialKernelFn( void *_params, SlaveVP *animVP )
seanhalle@0 75 { int32 i;
seanhalle@0 76 TestAppStruct *params = (TestAppStruct *)_params;
seanhalle@0 77 int32 *data = params->data;
seanhalle@0 78
seanhalle@0 79 DEBUG__printf(dbgAppFlow, "SerialKernel %d", params->startIter);
seanhalle@0 80
seanhalle@0 81 for( i=params->startIter; i < params->endIter; ++i )
seanhalle@0 82 { data[i] = square(i);
seanhalle@0 83 }
seanhalle@0 84 PRServ__DKU_end_serial_kernel( animVP );
seanhalle@0 85 }
seanhalle@0 86
seanhalle@0 87 void
seanhalle@0 88 dividerFn( DKUPiece *pieceToDivide )
seanhalle@0 89 {
seanhalle@0 90 int32 idx, childIdx, numChildren, size, *data;
seanhalle@0 91 DKUPiece *childPiece, **childrenArray;
seanhalle@0 92 TestAppStruct *params;
seanhalle@0 93 DEBUG__printf(dbgAppFlow, "divider %p", pieceToDivide)
seanhalle@0 94
seanhalle@0 95 numChildren = pieceToDivide->numChildren;
seanhalle@0 96 childrenArray = PR__malloc( numChildren * sizeof(DKUPiece *) );
seanhalle@0 97 size = ((TestAppStruct*)pieceToDivide->payload)->size;
seanhalle@0 98 data = ((TestAppStruct*)pieceToDivide->payload)->data;
seanhalle@0 99 int chunkSize = size/numChildren; //for portability, lang would choose this dynamically at run time
seanhalle@0 100 //note: should do processing to catch too small a chunksize and deal w/it
seanhalle@0 101 for( childIdx = 0; childIdx < numChildren; childIdx++ )
seanhalle@0 102 { params = PR__malloc(sizeof(TestAppStruct)); //these define work the task performs
seanhalle@0 103 idx = childIdx * chunkSize;
seanhalle@0 104 params->startIter = idx;
seanhalle@0 105 params->endIter = idx + chunkSize -1;
seanhalle@0 106 params->data = data;
seanhalle@0 107 params->size = size;
seanhalle@0 108 childPiece = PRServ__DKU_make_child_piece_from( pieceToDivide );
seanhalle@0 109 childPiece->payload = params;
seanhalle@0 110 childrenArray[childIdx] = childPiece;
seanhalle@0 111 }
seanhalle@0 112 params->endIter = size -1; //catch truncation error from chunkSize calc
seanhalle@0 113
seanhalle@0 114 pieceToDivide->children = childrenArray;
seanhalle@0 115 }
seanhalle@0 116
seanhalle@0 117 void undividerFn( DKUPiece *piece )
seanhalle@0 118 {
seanhalle@0 119 //DEBUG__printf(dbgAppFlow, "Undivider %p", piece)
seanhalle@0 120 //nothing to do -- request handler does counting of completions
seanhalle@0 121 }
seanhalle@0 122