diff --git a/namd/src/colvarproxy_namd.C b/namd/src/colvarproxy_namd.C index 0047bf193..f9fb10298 100644 --- a/namd/src/colvarproxy_namd.C +++ b/namd/src/colvarproxy_namd.C @@ -46,6 +46,9 @@ colvarproxy_namd::colvarproxy_namd() { engine_name_ = "NAMD"; +#if CMK_SMP && USE_CKLOOP + charm_lock_state = CmiCreateLock(); +#endif version_int = get_version_from_string(COLVARPROXY_VERSION); #if CMK_TRACE_ENABLED @@ -151,6 +154,9 @@ colvarproxy_namd::colvarproxy_namd() colvarproxy_namd::~colvarproxy_namd() { +#if CMK_SMP && USE_CKLOOP + CmiDestroyLock(charm_lock_state); +#endif delete reduction; } @@ -1529,9 +1535,11 @@ void calc_colvars_items_smp(int first, int last, void *result, int paramNum, voi int colvarproxy_namd::smp_colvars_loop() { colvarmodule *cv = this->colvars; + const int numChunks = smp_num_threads() > cv->variables_active_smp()->size() ? + cv->variables_active_smp()->size() : + smp_num_threads(); CkLoop_Parallelize(calc_colvars_items_smp, 1, this, - cv->variables_active_smp()->size(), - 0, cv->variables_active_smp()->size()-1); + numChunks, 0, cv->variables_active_smp()->size()-1); return cvm::get_error(); } @@ -1564,8 +1572,11 @@ void calc_cv_biases_smp(int first, int last, void *result, int paramNum, void *p int colvarproxy_namd::smp_biases_loop() { colvarmodule *cv = this->colvars; + const int numChunks = smp_num_threads() > cv->variables_active_smp()->size() ? + cv->variables_active_smp()->size() : + smp_num_threads(); CkLoop_Parallelize(calc_cv_biases_smp, 1, this, - cv->biases_active()->size(), 0, cv->biases_active()->size()-1); + numChunks, 0, cv->biases_active()->size()-1); return cvm::get_error(); } diff --git a/namd/src/colvarproxy_namd.h b/namd/src/colvarproxy_namd.h index 671d43bac..f58e20967 100644 --- a/namd/src/colvarproxy_namd.h +++ b/namd/src/colvarproxy_namd.h @@ -154,18 +154,20 @@ class colvarproxy_namd : public colvarproxy, public GlobalMaster { int smp_lock() { - charm_lock_state = CmiCreateLock(); + CmiLock(charm_lock_state); return COLVARS_OK; } int smp_trylock() { - return COLVARS_NOT_IMPLEMENTED; + const int ret = CmiTryLock(charm_lock_state); + if (ret == 0) return COLVARS_OK; + else return COLVARS_ERROR; } int smp_unlock() { - CmiDestroyLock(charm_lock_state); + CmiUnlock(charm_lock_state); return COLVARS_OK; }