Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions examples/charm++/fibonacci_with_futures/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Variables
CHARMC = /Users/stevenqie/software/charm/netlrts-darwin-arm8/bin/charmc
TARGET = fibonacci
SRCS = fib_futures.ci fib_futures.C

all: $(TARGET)

$(TARGET): $(SRCS)
$(CHARMC) fib_futures.ci
$(CHARMC) -c fib_futures.C
$(CHARMC) -o $(TARGET) fib_futures.o

clean:
rm -f *.o $(TARGET) fib.decl.h fib.def.h charmrun

.PHONY: all clean
69 changes: 69 additions & 0 deletions examples/charm++/fibonacci_with_futures/fib_futures.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#include "fib.decl.h"

#include <ckcallback.h>

int THRESHOLD = 30;

class ValueMsg: public CMessage_ValueMsg {
public:
int value;
};

class Main : public CBase_Main {
public:
Main(CkMigrateMessage *m) {};
Main(CkArgMsg* m) { thisProxy.run(atoi(m->argv[1])); }
void run(int n) {
CkFuture f = CkCreateFuture();
CProxy_Fib::ckNew(n, f);
ValueMsg *m = (ValueMsg*)CkWaitFuture(f);
CkPrintf("The requested Fibonacci number is : %d\n", m->value);
CkExit();
}
};

class Fib : public CBase_Fib {
public:
int result;
Fib(CkMigrateMessage *m) {};
Fib(int n, CkFuture f){
thisProxy.run(n, f);
}

void run(int n, CkFuture f) {
if (n < THRESHOLD) {
result = seqFib(n);
} else {

CkEntryOptions opts;
opts.setQueueing(CK_QUEUEING_LIFO);

CkFuture f1 = CkCreateFuture();
CkFuture f2 = CkCreateFuture();
CProxy_Fib::ckNew(n-1, f1, CK_PE_ANY, &opts);
CProxy_Fib::ckNew(n-2, f2, CK_PE_ANY, &opts);
ValueMsg* m1 = (ValueMsg*)CkWaitFuture(f1);
ValueMsg* m2 = (ValueMsg*)CkWaitFuture(f2);
result = m1->value + m2->value;
delete m1;
delete m2;
CkReleaseFuture(f1);
CkReleaseFuture(f2);
}
ValueMsg *m = new ValueMsg();
m->value = result;
CkSendToFuture(f, m);

delete this;

}

int seqFib(int n) {
if (n <= 1) {
return n;
}
return seqFib(n - 1) + seqFib(n - 2);
}
};

#include "fib.def.h"
13 changes: 13 additions & 0 deletions examples/charm++/fibonacci_with_futures/fib_futures.ci
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
mainmodule fib {
message ValueMsg;

mainchare Main {
entry Main(CkArgMsg* m);
entry void run(int n);
};

chare Fib {
entry Fib(int n, CkFuture f);
entry void run(int n, CkFuture f);
};
};
Loading