perfect_foresight_problem MEX: number of threads is now configurable
parent
0eab36e823
commit
7d9b2a557b
|
@ -71,6 +71,7 @@ options_.huge_number = 1e7;
|
||||||
% Default number of threads for parallelized mex files.
|
% Default number of threads for parallelized mex files.
|
||||||
options_.threads.kronecker.sparse_hessian_times_B_kronecker_C = num_procs;
|
options_.threads.kronecker.sparse_hessian_times_B_kronecker_C = num_procs;
|
||||||
options_.threads.local_state_space_iteration_2 = 1;
|
options_.threads.local_state_space_iteration_2 = 1;
|
||||||
|
options_.threads.perfect_foresight_problem = num_procs;
|
||||||
|
|
||||||
% steady state
|
% steady state
|
||||||
options_.jacobian_flag = true;
|
options_.jacobian_flag = true;
|
||||||
|
|
|
@ -191,7 +191,7 @@ if ~isreal(oo_.endo_simul(:)) % cannot happen with bytecode or the perfect_fores
|
||||||
model_dynamic_g1_nz = str2func([M_.fname,'.dynamic_g1_nz']);
|
model_dynamic_g1_nz = str2func([M_.fname,'.dynamic_g1_nz']);
|
||||||
[nzij_pred, nzij_current, nzij_fwrd] = model_dynamic_g1_nz();
|
[nzij_pred, nzij_current, nzij_fwrd] = model_dynamic_g1_nz();
|
||||||
|
|
||||||
residuals = perfect_foresight_problem(yy(:), M_.fname, sum(M_.dynamic_tmp_nbr(1:2)), y0, yT, oo_.exo_simul, M_.params, oo_.steady_state, periods, M_.endo_nbr, M_.maximum_lag, M_.maximum_endo_lag, M_.lead_lag_incidence, nzij_pred, nzij_current, nzij_fwrd, M_.has_external_function, options_.use_dll);
|
residuals = perfect_foresight_problem(yy(:), M_.fname, sum(M_.dynamic_tmp_nbr(1:2)), y0, yT, oo_.exo_simul, M_.params, oo_.steady_state, periods, M_.endo_nbr, M_.maximum_lag, M_.maximum_endo_lag, M_.lead_lag_incidence, nzij_pred, nzij_current, nzij_fwrd, M_.has_external_function, options_.use_dll, options_.threads.perfect_foresight_problem);
|
||||||
|
|
||||||
if max(abs(residuals))< options_.dynatol.f
|
if max(abs(residuals))< options_.dynatol.f
|
||||||
oo_.deterministic_simulation.status = 1;
|
oo_.deterministic_simulation.status = 1;
|
||||||
|
|
|
@ -140,7 +140,7 @@ if nargout>1
|
||||||
model_dynamic_g1_nz = str2func([M_.fname,'.dynamic_g1_nz']);
|
model_dynamic_g1_nz = str2func([M_.fname,'.dynamic_g1_nz']);
|
||||||
[nzij_pred, nzij_current, nzij_fwrd] = model_dynamic_g1_nz();
|
[nzij_pred, nzij_current, nzij_fwrd] = model_dynamic_g1_nz();
|
||||||
|
|
||||||
residuals = perfect_foresight_problem(yy(:), M_.fname, sum(M_.dynamic_tmp_nbr(1:2)), y0, yT, oo_.exo_simul, M_.params, oo_.steady_state, periods, M_.endo_nbr, M_.maximum_lag, M_.maximum_endo_lag, M_.lead_lag_incidence, nzij_pred, nzij_current, nzij_fwrd, M_.has_external_function, options_.use_dll);
|
residuals = perfect_foresight_problem(yy(:), M_.fname, sum(M_.dynamic_tmp_nbr(1:2)), y0, yT, oo_.exo_simul, M_.params, oo_.steady_state, periods, M_.endo_nbr, M_.maximum_lag, M_.maximum_endo_lag, M_.lead_lag_incidence, nzij_pred, nzij_current, nzij_fwrd, M_.has_external_function, options_.use_dll, options_.threads.perfect_foresight_problem);
|
||||||
end
|
end
|
||||||
maxerror = max(max(abs(residuals)));
|
maxerror = max(max(abs(residuals)));
|
||||||
end
|
end
|
||||||
|
|
|
@ -67,7 +67,7 @@ h1 = clock;
|
||||||
for iter = 1:options.simul.maxit
|
for iter = 1:options.simul.maxit
|
||||||
h2 = clock;
|
h2 = clock;
|
||||||
|
|
||||||
[res, A] = perfect_foresight_problem(y, M.fname, sum(M.dynamic_tmp_nbr(1:2)), y0, yT, exogenousvariables, M.params, steadystate, periods, ny, M.maximum_lag, M.maximum_endo_lag, M.lead_lag_incidence, nzij_pred, nzij_current, nzij_fwrd, M.has_external_function, options.use_dll);
|
[res, A] = perfect_foresight_problem(y, M.fname, sum(M.dynamic_tmp_nbr(1:2)), y0, yT, exogenousvariables, M.params, steadystate, periods, ny, M.maximum_lag, M.maximum_endo_lag, M.lead_lag_incidence, nzij_pred, nzij_current, nzij_fwrd, M.has_external_function, options.use_dll, options.threads.perfect_foresight_problem);
|
||||||
|
|
||||||
if options.endogenous_terminal_period && iter > 1
|
if options.endogenous_terminal_period && iter > 1
|
||||||
for it = 1:periods
|
for it = 1:periods
|
||||||
|
|
|
@ -56,7 +56,7 @@ else
|
||||||
model_dynamic_g1_nz = str2func([M.fname,'.dynamic_g1_nz']);
|
model_dynamic_g1_nz = str2func([M.fname,'.dynamic_g1_nz']);
|
||||||
[nzij_pred, nzij_current, nzij_fwrd] = model_dynamic_g1_nz();
|
[nzij_pred, nzij_current, nzij_fwrd] = model_dynamic_g1_nz();
|
||||||
|
|
||||||
[y, check] = dynare_solve(@perfect_foresight_problem,z(:), options, M.fname, sum(M.dynamic_tmp_nbr(1:2)), y0, yT, exogenousvariables, M.params, steadystate, options.periods, M.endo_nbr, M.maximum_lag, M.maximum_endo_lag, M.lead_lag_incidence, nzij_pred, nzij_current, nzij_fwrd, M.has_external_function, options.use_dll);
|
[y, check] = dynare_solve(@perfect_foresight_problem,z(:), options, M.fname, sum(M.dynamic_tmp_nbr(1:2)), y0, yT, exogenousvariables, M.params, steadystate, options.periods, M.endo_nbr, M.maximum_lag, M.maximum_endo_lag, M.lead_lag_incidence, nzij_pred, nzij_current, nzij_fwrd, M.has_external_function, options.use_dll, options.threads.perfect_foresight_problem);
|
||||||
end
|
end
|
||||||
|
|
||||||
if all(imag(y)<.1*options.dynatol.x)
|
if all(imag(y)<.1*options.dynatol.x)
|
||||||
|
|
|
@ -40,6 +40,8 @@ switch mexname
|
||||||
options_.threads.kronecker.sparse_hessian_times_B_kronecker_C = n;
|
options_.threads.kronecker.sparse_hessian_times_B_kronecker_C = n;
|
||||||
case 'local_state_space_iteration_2'
|
case 'local_state_space_iteration_2'
|
||||||
options_.threads.local_state_space_iteration_2 = n;
|
options_.threads.local_state_space_iteration_2 = n;
|
||||||
|
case 'perfect_foresight_problem'
|
||||||
|
options_.threads.perfect_foresight_problem = n;
|
||||||
otherwise
|
otherwise
|
||||||
message = [ mexname ' is not a known parallel mex file.' ];
|
message = [ mexname ' is not a known parallel mex file.' ];
|
||||||
message_id = 'Dynare:Threads:UnknownParallelMex';
|
message_id = 'Dynare:Threads:UnknownParallelMex';
|
||||||
|
|
|
@ -28,8 +28,8 @@
|
||||||
void
|
void
|
||||||
mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
|
mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
|
||||||
{
|
{
|
||||||
if (nlhs < 1 || nlhs > 2 || nrhs != 18)
|
if (nlhs < 1 || nlhs > 2 || nrhs != 19)
|
||||||
mexErrMsgTxt("Must have 18 input arguments and 1 or 2 output arguments");
|
mexErrMsgTxt("Must have 19 input arguments and 1 or 2 output arguments");
|
||||||
bool compute_jacobian = nlhs == 2;
|
bool compute_jacobian = nlhs == 2;
|
||||||
|
|
||||||
// Give explicit names to input arguments
|
// Give explicit names to input arguments
|
||||||
|
@ -51,6 +51,7 @@ mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
|
||||||
const mxArray *nzij_fwrd_mx = prhs[15];
|
const mxArray *nzij_fwrd_mx = prhs[15];
|
||||||
const mxArray *has_external_function_mx = prhs[16];
|
const mxArray *has_external_function_mx = prhs[16];
|
||||||
const mxArray *use_dll_mx = prhs[17];
|
const mxArray *use_dll_mx = prhs[17];
|
||||||
|
const mxArray *num_threads_mx = prhs[18];
|
||||||
|
|
||||||
// Check input and map it to local variables
|
// Check input and map it to local variables
|
||||||
if (!(mxIsChar(basename_mx) && mxGetM(basename_mx) == 1))
|
if (!(mxIsChar(basename_mx) && mxGetM(basename_mx) == 1))
|
||||||
|
@ -131,6 +132,10 @@ mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
|
||||||
mexErrMsgTxt("use_dll should be a logical scalar");
|
mexErrMsgTxt("use_dll should be a logical scalar");
|
||||||
bool use_dll = static_cast<bool>(mxGetScalar(use_dll_mx));
|
bool use_dll = static_cast<bool>(mxGetScalar(use_dll_mx));
|
||||||
|
|
||||||
|
if (!(mxIsScalar(num_threads_mx) && mxIsNumeric(num_threads_mx)))
|
||||||
|
mexErrMsgTxt("num_threads should be a numeric scalar");
|
||||||
|
int num_threads = static_cast<int>(mxGetScalar(num_threads_mx));
|
||||||
|
|
||||||
// Allocate output matrices
|
// Allocate output matrices
|
||||||
plhs[0] = mxCreateDoubleMatrix(periods*ny, 1, mxREAL);
|
plhs[0] = mxCreateDoubleMatrix(periods*ny, 1, mxREAL);
|
||||||
double *stacked_residual = mxGetPr(plhs[0]);
|
double *stacked_residual = mxGetPr(plhs[0]);
|
||||||
|
@ -178,7 +183,7 @@ mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
|
||||||
|
|
||||||
/* Parallelize the main loop, if use_dll and no external function (to avoid
|
/* Parallelize the main loop, if use_dll and no external function (to avoid
|
||||||
parallel calls to MATLAB) */
|
parallel calls to MATLAB) */
|
||||||
#pragma omp parallel if (use_dll && !has_external_function)
|
#pragma omp parallel num_threads(num_threads) if (use_dll && !has_external_function)
|
||||||
{
|
{
|
||||||
// Allocate (thread-private) model evaluator (which allocates space for temporaries)
|
// Allocate (thread-private) model evaluator (which allocates space for temporaries)
|
||||||
std::unique_ptr<DynamicModelCaller> m;
|
std::unique_ptr<DynamicModelCaller> m;
|
||||||
|
|
Loading…
Reference in New Issue