Loading drivers/testParallelizer2.cpp +3 −4 Original line number Diff line number Diff line Loading @@ -12,11 +12,10 @@ int main(int argc, char** argv) PsimagLite::Parallizer2<> parallelizer(threads); parallelizer.parallelFor([&v](SizeType i, SizeType) parallelizer.parallelFor(0, n, [&v](SizeType i, SizeType) { v[i] = i + 42; // <<<--- body of the loop }, n); // <<<---- total of the loop v[i] = i + 42; }); /* for (SizeType i = 0; i < n; ++i) { Loading src/Parallelizer2Pthread.h +19 −16 Original line number Diff line number Diff line Loading @@ -28,14 +28,15 @@ template<typename SomeLambdaType, > struct PthreadFunctionStruct { PthreadFunctionStruct() : pfh(0),loadBalancer(0),threadNum(0),nthreads(0),total(0),cpu(0) : pfh(0),loadBalancer(0),threadNum(0),nthreads(0),start(0),end(0),cpu(0) {} const SomeLambdaType* pfh; const LoadBalancerType* loadBalancer; int threadNum; SizeType nthreads; SizeType total; SizeType start; SizeType end; SizeType cpu; }; Loading @@ -57,8 +58,8 @@ void *thread_function_wrapper(void *dummyPtr) for (SizeType p = 0; p < blockSize; ++p) { SizeType taskNumber = pfs->loadBalancer->taskNumber(pfs->threadNum, p); if (taskNumber > pfs->total) break; (*pfh)(taskNumber, pfs->threadNum); if (taskNumber + pfs->start >= pfs->end) break; (*pfh)(taskNumber + pfs->start, pfs->threadNum); } return 0; Loading @@ -78,29 +79,30 @@ public: // no weights, no balancer ==> create weights, set all weigths to 1, delegate template<typename SomeLambdaType> void parallelFor(const SomeLambdaType& lambda, SizeType ntasks) void parallelFor(SizeType start, SizeType end, const SomeLambdaType& lambda) { VectorSizeType weights(ntasks,1); parallelFor(lambda, weights, ntasks); VectorSizeType weights(end - start, 1); parallelFor(start, end, lambda, weights); } // weights, no balancer ==> create balancer with weights ==> delegate template<typename SomeLambdaType> void parallelFor(const SomeLambdaType& lambda, const VectorSizeType& weights, SizeType ntasks) void parallelFor(SizeType start, SizeType end, const SomeLambdaType& lambda, const VectorSizeType& weights) { LoadBalancerType* loadBalancer = new LoadBalancerType(weights, nthreads_); parallelFor(lambda, *loadBalancer, ntasks); parallelFor(start, end, lambda, *loadBalancer); delete loadBalancer; loadBalancer = 0; } template<typename SomeLambdaType> void parallelFor(const SomeLambdaType& lambda, const LoadBalancerType& loadBalancer, SizeType ntasks) void parallelFor(SizeType start, SizeType end, const SomeLambdaType& lambda, const LoadBalancerType& loadBalancer) { PthreadFunctionStruct<SomeLambdaType>* pfs = new PthreadFunctionStruct<SomeLambdaType>[nthreads_]; Loading @@ -111,7 +113,8 @@ public: pfs[j].pfh = λ pfs[j].loadBalancer = &loadBalancer; pfs[j].threadNum = j; pfs[j].total = ntasks; pfs[j].start = start; pfs[j].end = end; pfs[j].nthreads = nthreads_; attr[j] = new pthread_attr_t; Loading src/Parallelizer2Serial.h +2 −2 Original line number Diff line number Diff line Loading @@ -16,9 +16,9 @@ public: } template<typename SomeLambdaType> void parallelFor(const SomeLambdaType& lambda, SizeType n) void parallelFor(SizeType start, SizeType end, const SomeLambdaType& lambda) { for (SizeType i = 0; i < n; ++i) for (SizeType i = start; i < end; ++i) lambda(i, 0); } }; Loading Loading
drivers/testParallelizer2.cpp +3 −4 Original line number Diff line number Diff line Loading @@ -12,11 +12,10 @@ int main(int argc, char** argv) PsimagLite::Parallizer2<> parallelizer(threads); parallelizer.parallelFor([&v](SizeType i, SizeType) parallelizer.parallelFor(0, n, [&v](SizeType i, SizeType) { v[i] = i + 42; // <<<--- body of the loop }, n); // <<<---- total of the loop v[i] = i + 42; }); /* for (SizeType i = 0; i < n; ++i) { Loading
src/Parallelizer2Pthread.h +19 −16 Original line number Diff line number Diff line Loading @@ -28,14 +28,15 @@ template<typename SomeLambdaType, > struct PthreadFunctionStruct { PthreadFunctionStruct() : pfh(0),loadBalancer(0),threadNum(0),nthreads(0),total(0),cpu(0) : pfh(0),loadBalancer(0),threadNum(0),nthreads(0),start(0),end(0),cpu(0) {} const SomeLambdaType* pfh; const LoadBalancerType* loadBalancer; int threadNum; SizeType nthreads; SizeType total; SizeType start; SizeType end; SizeType cpu; }; Loading @@ -57,8 +58,8 @@ void *thread_function_wrapper(void *dummyPtr) for (SizeType p = 0; p < blockSize; ++p) { SizeType taskNumber = pfs->loadBalancer->taskNumber(pfs->threadNum, p); if (taskNumber > pfs->total) break; (*pfh)(taskNumber, pfs->threadNum); if (taskNumber + pfs->start >= pfs->end) break; (*pfh)(taskNumber + pfs->start, pfs->threadNum); } return 0; Loading @@ -78,29 +79,30 @@ public: // no weights, no balancer ==> create weights, set all weigths to 1, delegate template<typename SomeLambdaType> void parallelFor(const SomeLambdaType& lambda, SizeType ntasks) void parallelFor(SizeType start, SizeType end, const SomeLambdaType& lambda) { VectorSizeType weights(ntasks,1); parallelFor(lambda, weights, ntasks); VectorSizeType weights(end - start, 1); parallelFor(start, end, lambda, weights); } // weights, no balancer ==> create balancer with weights ==> delegate template<typename SomeLambdaType> void parallelFor(const SomeLambdaType& lambda, const VectorSizeType& weights, SizeType ntasks) void parallelFor(SizeType start, SizeType end, const SomeLambdaType& lambda, const VectorSizeType& weights) { LoadBalancerType* loadBalancer = new LoadBalancerType(weights, nthreads_); parallelFor(lambda, *loadBalancer, ntasks); parallelFor(start, end, lambda, *loadBalancer); delete loadBalancer; loadBalancer = 0; } template<typename SomeLambdaType> void parallelFor(const SomeLambdaType& lambda, const LoadBalancerType& loadBalancer, SizeType ntasks) void parallelFor(SizeType start, SizeType end, const SomeLambdaType& lambda, const LoadBalancerType& loadBalancer) { PthreadFunctionStruct<SomeLambdaType>* pfs = new PthreadFunctionStruct<SomeLambdaType>[nthreads_]; Loading @@ -111,7 +113,8 @@ public: pfs[j].pfh = λ pfs[j].loadBalancer = &loadBalancer; pfs[j].threadNum = j; pfs[j].total = ntasks; pfs[j].start = start; pfs[j].end = end; pfs[j].nthreads = nthreads_; attr[j] = new pthread_attr_t; Loading
src/Parallelizer2Serial.h +2 −2 Original line number Diff line number Diff line Loading @@ -16,9 +16,9 @@ public: } template<typename SomeLambdaType> void parallelFor(const SomeLambdaType& lambda, SizeType n) void parallelFor(SizeType start, SizeType end, const SomeLambdaType& lambda) { for (SizeType i = 0; i < n; ++i) for (SizeType i = start; i < end; ++i) lambda(i, 0); } }; Loading