Change reduction wrapper callbacks to use CkReductionTarget
[charm.git] / examples / charm++ / typed_reduction / TypedReduction.cc
1 #include "TypedReduction.h"
2 #include <stdlib.h>
3
4 Driver::Driver(CkArgMsg* args) {
5     int array_size = 10;
6     if (args->argc > 1) array_size = strtol(args->argv[1], NULL, 10);
7     w = CProxy_Worker::ckNew(array_size);
8     CkCallback *cb = new CkCallback(CkIndex_Driver::untyped_done(NULL), thisProxy);
9     w.ckSetReductionClient(cb);
10     w.reduce();
11 }
12
13 void Driver::untyped_done(CkReductionMsg* m) {
14     int* output = (int*)m->getData();
15     CkPrintf("Untyped Sum: %d\n", output[0]);
16     delete m;
17
18     CkCallback *cb = new CkCallback(
19             CkReductionTarget(Driver, typed_done), thisProxy);
20     w.ckSetReductionClient(cb);
21     w.reduce();
22 }
23
24 void Driver::typed_done(int result)
25 {
26     CkPrintf("Typed Sum: %d\n", result);
27     CkCallback *cb = new CkCallback(
28             CkReductionTarget(Driver, typed_array_done), thisProxy);
29     w.ckSetReductionClient(cb);
30     w.reduce_array();
31 }
32
33 void Driver::typed_array_done(int* results, int n)
34 {
35     CkPrintf("Typed Sum: [ ");
36     for (int i=0; i<n; ++i) CkPrintf("%d ", results[i]);
37     CkPrintf("]\n");
38     CkCallback *cb = new CkCallback(
39             CkReductionTarget(Driver, typed_array_done2), thisProxy);
40     w.ckSetReductionClient(cb);
41     w.reduce_array();
42 }
43
44 void Driver::typed_array_done2(int x, int y, int z)
45 {
46     CkPrintf("Typed Sum: (x, y, z) = (%d, %d, %d)\n", x, y, z);
47     CkExit();
48 }
49
50 Worker::Worker() { }
51
52 void Worker::reduce() {
53     int contribution = 1;
54     contribute(1*sizeof(int), &contribution, CkReduction::sum_int); 
55 }
56
57 void Worker::reduce_array() {
58     int contribution[3] = { 1, 2, 3 };
59     contribute(3*sizeof(int), &contribution, CkReduction::sum_int); 
60 }
61
62 #include "TypedReduction.def.h"