How to use parsim with a Simulink model containing an FMU with dependencies? Model works with sim.
Hi,
We have a Simulink model that solves well using the sim command and the Simulink UI "Run" button. The FMU launches a solver process and two talk to each other over ZeroMQ and this works well for one instance. The port that the solver binds to is determined at run time based on the available ports and theoretically this approach should work when multiple simulations are launched in parallel, since no common resources are used or shared. The FMU also needs a few DLLs that are loaded at run time. These are currently placed in the same folder as the Simulink model and runner script.
We have installed the Parallel Computing Toolbox and can run the base example provided. However, when we try to programmatically run our simulations using parsim, it gets stuck on the "loading the model" stage for a long time. We developed our parsim implementation by extending the base example in docs and use setVariable() to assign value to individual simulations. We are also just wanting to parallelize in the "local" context on a 8 core CPU Windows x64 machine. We were wondering, to make sure that the dependencies are correctly getting copied to the individual workers:
Is it possible to view/inspect these temporary directories used by the worker processes? Where are they typically located? I did not find them in the slprj folder.
How can we control which dependencies are copied where? While we do not, for our case, need specific dependencies on specific workers, this maybe needed at times.
Is there a general rule of thumb around how big the FMU should be or the number or size of dependencies or workspace data should be for parsim workers to "work well"?
Also, could we get clarification on the following line in this answer post:
"The ‘parsim’ function was employed to simulate multiple models specified in the ‘SimulationInput’ object concurrently. While ‘parsim’ can effectively reduce the simulation time, it is crucial to structure the model appropriately. Specifically, the simulation should not rely on the results of previous steps. In other words, there should be no dependency between the simulations of the model at different time steps."
Does this mean that in parsim, the model does not keep track of the model state between timesteps? So does this mean we can only solve for one timestep at a time and then relaunch the sim?Hi,
We have a Simulink model that solves well using the sim command and the Simulink UI "Run" button. The FMU launches a solver process and two talk to each other over ZeroMQ and this works well for one instance. The port that the solver binds to is determined at run time based on the available ports and theoretically this approach should work when multiple simulations are launched in parallel, since no common resources are used or shared. The FMU also needs a few DLLs that are loaded at run time. These are currently placed in the same folder as the Simulink model and runner script.
We have installed the Parallel Computing Toolbox and can run the base example provided. However, when we try to programmatically run our simulations using parsim, it gets stuck on the "loading the model" stage for a long time. We developed our parsim implementation by extending the base example in docs and use setVariable() to assign value to individual simulations. We are also just wanting to parallelize in the "local" context on a 8 core CPU Windows x64 machine. We were wondering, to make sure that the dependencies are correctly getting copied to the individual workers:
Is it possible to view/inspect these temporary directories used by the worker processes? Where are they typically located? I did not find them in the slprj folder.
How can we control which dependencies are copied where? While we do not, for our case, need specific dependencies on specific workers, this maybe needed at times.
Is there a general rule of thumb around how big the FMU should be or the number or size of dependencies or workspace data should be for parsim workers to "work well"?
Also, could we get clarification on the following line in this answer post:
"The ‘parsim’ function was employed to simulate multiple models specified in the ‘SimulationInput’ object concurrently. While ‘parsim’ can effectively reduce the simulation time, it is crucial to structure the model appropriately. Specifically, the simulation should not rely on the results of previous steps. In other words, there should be no dependency between the simulations of the model at different time steps."
Does this mean that in parsim, the model does not keep track of the model state between timesteps? So does this mean we can only solve for one timestep at a time and then relaunch the sim? Hi,
We have a Simulink model that solves well using the sim command and the Simulink UI "Run" button. The FMU launches a solver process and two talk to each other over ZeroMQ and this works well for one instance. The port that the solver binds to is determined at run time based on the available ports and theoretically this approach should work when multiple simulations are launched in parallel, since no common resources are used or shared. The FMU also needs a few DLLs that are loaded at run time. These are currently placed in the same folder as the Simulink model and runner script.
We have installed the Parallel Computing Toolbox and can run the base example provided. However, when we try to programmatically run our simulations using parsim, it gets stuck on the "loading the model" stage for a long time. We developed our parsim implementation by extending the base example in docs and use setVariable() to assign value to individual simulations. We are also just wanting to parallelize in the "local" context on a 8 core CPU Windows x64 machine. We were wondering, to make sure that the dependencies are correctly getting copied to the individual workers:
Is it possible to view/inspect these temporary directories used by the worker processes? Where are they typically located? I did not find them in the slprj folder.
How can we control which dependencies are copied where? While we do not, for our case, need specific dependencies on specific workers, this maybe needed at times.
Is there a general rule of thumb around how big the FMU should be or the number or size of dependencies or workspace data should be for parsim workers to "work well"?
Also, could we get clarification on the following line in this answer post:
"The ‘parsim’ function was employed to simulate multiple models specified in the ‘SimulationInput’ object concurrently. While ‘parsim’ can effectively reduce the simulation time, it is crucial to structure the model appropriately. Specifically, the simulation should not rely on the results of previous steps. In other words, there should be no dependency between the simulations of the model at different time steps."
Does this mean that in parsim, the model does not keep track of the model state between timesteps? So does this mean we can only solve for one timestep at a time and then relaunch the sim? parsim, fmu MATLAB Answers — New Questions