--- trunk/gadget/hooke.cc 2015/07/24 18:36:24 12 +++ trunk/gadget/hooke.cc 2015/09/01 19:14:33 15 @@ -156,17 +156,9 @@ DoubleVector z(point); minf = prevbest; -// for (int k=0;kSimulateAndUpdate(z); -// cout << i <<"-z["<< param[i]<<"]:" <= nvars) paral_tokens = nvars - i; - omp_set_dynamic(0); - omp_set_nested(1); -#pragma omp parallel for num_threads(paral_tokens) private(k) +#pragma omp parallel for num_threads(paral_tokens) private(k) //parallelize the parameters (numThr/2) for (j = 0; j < paral_tokens; ++j) { storage[j].z = z; storage[j].delta = delta; @@ -233,7 +224,7 @@ v1[k] += delta[k]; v2[k] -= delta[k]; -#pragma omp parallel sections num_threads(2) +#pragma omp parallel sections num_threads(2) //parrallelize the +/- delta simulation for each parameter { #pragma omp section { @@ -269,7 +260,7 @@ } } } - + delete[] storage; for (i = 0; i < nvars; ++i) point[i] = z[i]; return minf; @@ -300,7 +291,7 @@ EcoSystem->scaleVariables(); #ifndef NO_OPENMP int numThr = omp_get_max_threads ( ); - for (i = 0; i < numThr; i++) + for (i = 0; i < numThr; i++) // scale the variables for the ecosystem of every thread EcoSystems[i]->scaleVariables(); #endif EcoSystem->getOptScaledValues(x); @@ -369,7 +360,7 @@ for (i = 0; i < nvars; i++) trialx[i] = x[i]; #ifndef NO_OPENMP - newf = this->bestNearbyOMP(delta, trialx, bestf, param); + newf = this->bestNearbyRepro(delta, trialx, bestf, param); if (newf == -1) { handle.logMessage(LOGINFO, "\nStopping Hooke & Jeeves optimisation algorithm\n"); handle.logMessage(LOGINFO, "\nThe number of threads must be a multiple of 2\n"); @@ -464,7 +455,7 @@ x[i] = trialx[i]; #ifndef NO_OPENMP - newf = this->bestNearbyOMP(delta, trialx, bestf, param); + newf = this->bestNearbyRepro(delta, trialx, bestf, param); if (newf == -1) { handle.logMessage(LOGINFO, "\nStopping Hooke & Jeeves optimisation algorithm\n"); handle.logMessage(LOGINFO, "\nThe number of threads must be a multiple of 2\n"); @@ -533,8 +524,8 @@ } /* Functions to perform the parallelization of the algorithm of HJ with OpenMP*/ -#ifdef GADGET_OPENMP -double OptInfoHooke::bestNearbyOMP2(DoubleVector& delta, DoubleVector& point, double prevbest, IntVector& param) { +#ifdef SPECULATIVE +double OptInfoHooke::bestNearbySpec(DoubleVector& delta, DoubleVector& point, double prevbest, IntVector& param) { double minf; int i, j, k, ii; DoubleVector z(point); @@ -558,13 +549,13 @@ return -1; } + omp_set_dynamic(0); + omp_set_nested(1); //permit the nested parallelization for (ii=0; ii< paral_tokens; ii++) { i = 0; while ( i < nvars) { if ((i + paral_tokens -1) >= nvars) paral_tokens = nvars - i; - omp_set_dynamic(0); - omp_set_nested(1); #pragma omp parallel for num_threads(paral_tokens) private(k) for (j = 0; j < paral_tokens; ++j) { storage[j].z = z; @@ -644,11 +635,9 @@ IntVector trapped(nvars, 0); EcoSystem->scaleVariables(); - #ifndef NO_OPENMP int numThr = omp_get_max_threads ( ); - for (i = 0; i < numThr; i++) + for (i = 0; i < numThr; i++) // scale the variables for the ecosystem of every thread EcoSystems[i]->scaleVariables(); - #endif EcoSystem->getOptScaledValues(x); EcoSystem->getOptLowerBounds(lowerb); EcoSystem->getOptUpperBounds(upperb); @@ -715,7 +704,7 @@ for (i = 0; i < nvars; i++) trialx[i] = x[i]; #ifndef NO_OPENMP - newf = this->bestNearbyOMP2(delta, trialx, bestf, param); + newf = this->bestNearbySpec(delta, trialx, bestf, param); if (newf == -1) { handle.logMessage(LOGINFO, "\nStopping Hooke & Jeeves optimisation algorithm\n"); handle.logMessage(LOGINFO, "\nThe number of threads must be a multiple of 2\n"); @@ -810,7 +799,7 @@ x[i] = trialx[i]; #ifndef NO_OPENMP - newf = this->bestNearbyOMP2(delta, trialx, bestf, param); + newf = this->bestNearbySpec(delta, trialx, bestf, param); if (newf == -1) { handle.logMessage(LOGINFO, "\nStopping Hooke & Jeeves optimisation algorithm\n"); handle.logMessage(LOGINFO, "\nThe number of threads must be a multiple of 2\n");