| 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
|