#include <iostream> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <omp.h> #include "ff/farm.hpp" using namespace std; using namespace ff; float **a; int n; float calc(float x) { long iter = (long) x; for(long i=0; i<iter; i++) x = sin(x); return(x); } class Worker : public ff_node { void * svc(void * t) { float * task = (float *) t; float * sum = new float; for(int i=0; i<n; i++) { task[i] = calc(task[i]); *sum += task[i]; } return ((void *) sum); } }; class Emitter : public ff_node { void * svc(void * t) { a = new float * [n]; for(int i=0; i<n; i++) a[i] = new float[n]; for(int i=0; i<n; i++) for(int j=0; j<n; j++) a[i][j] = i* 100 + j * 10; for(int i=0; i<n; i++) ff_send_out((void *) a[i]); return(EOS); } }; class Collector : public ff_node { private: float sum; public: int svc_init() { sum = 0.0; return(0); } void svc_end() { cout << "sum is " << sum << endl; return; } void * svc(void * t) { float * x = ((float *) t) ; sum += *x; return GO_ON; } }; int main(int argc, char * argv[]) { if(argc == 1) { cout << "Usage is:\n" << argv[0] << " veclen numthread " << endl; return(0); } n = atoi(argv[1]); int nw; float tc1; if(argc == 3) { nw = atoi(argv[2]); } if(argc == 4) { nw = atoi(argv[3]); tc1 = atof(argv[2]); } float sum = 0.0; ff_farm<> farm; vector<ff_node *> workers; for(int i=0;i<nw;++i) workers.push_back(new Worker); farm.add_workers(workers); farm.add_collector(new Collector); farm.add_emitter(new Emitter); float ts0 = omp_get_wtime(); farm.run_and_wait_end(); float ts1 = omp_get_wtime(); float tc = ts1 - ts0; cout << tc << " " ; if(argc==4) { cout << " sp = " << tc1 / tc; } cout << endl; return(0); }