00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <unistd.h>
00004 #include <zmq.hpp>
00005 #include "async-worker.h"
00006 #include <vector>
00007 #include <math.h>
00008
00009 typedef std::vector<double> Numbers ;
00010 typedef Numbers::iterator Iterator ;
00011
00012 struct Crunch : public async::worker_t
00013 {
00014
00015
00016
00017
00018
00019
00020 Crunch(Iterator startRange, Iterator endRange, double* resultPtr)
00021 : worker_t()
00022 , start(startRange)
00023 , end(endRange)
00024 , result(resultPtr)
00025 , privateSum(0.0)
00026 {}
00027
00028
00029
00030
00031 virtual void Work()
00032 {
00033 for ( auto it = start ; it != end ; ++it )
00034 {
00035 privateSum += abs(abs(*it) + sin((unsigned long long)(*it)) * abs(cos(*it))) + ((float)*it * (unsigned short)*it) ;
00036 }
00037 }
00038
00039
00040
00041
00042 virtual void Result()
00043 {
00044 *(result) += privateSum ;
00045 }
00046
00047 Iterator start, end ;
00048 double* result ;
00049 double privateSum ;
00050 } ;
00051
00052
00053
00054
00055 int main(int argc, const char* const argv[])
00056 {
00057
00058
00059
00060
00061 Numbers numbers(50 * 1000 * 1000) ;
00062
00063 for ( size_t i = 0 ; i < numbers.size() ; ++i )
00064 {
00065 numbers[i] = (double)i ;
00066 }
00067
00068
00069
00070
00071
00072 int batchSize = atoi(argv[1]) ;
00073
00074
00075
00076
00077 double result = 0.0 ;
00078
00079 if ( batchSize == 0 )
00080 {
00081
00082
00083
00084 Crunch serial(numbers.begin(), numbers.end(), &result) ;
00085 serial.Work() ;
00086 serial.Result() ;
00087 }
00088 else
00089 {
00090
00091
00092
00093 auto start = numbers.begin() ;
00094 do
00095 {
00096
00097
00098
00099
00100 auto end = std::min( start + batchSize, numbers.end() ) ;
00101 auto workload = new Crunch(start, end, &result) ;
00102
00103 async::Queue(workload) ;
00104
00105 start = end ;
00106 }
00107 while ( start != numbers.end() ) ;
00108
00109
00110
00111
00112 async::GetResults() ;
00113 }
00114
00115 printf("total is %g\n", result) ;
00116
00117 return 0 ;
00118 }
00119