3 votes

Simulation Simulink avec parfor (Calcul parallèle)

J'ai posé aujourd'hui une question sur le calcul parallèle avec Matlab-Simulink. Comme ma question précédente est un peu en désordre et qu'il y a beaucoup de choses dans le code qui ne sont pas vraiment liées au problème.

Mon problème est le suivant

Je veux simuler quelque chose dans une boucle parfor, tandis que ma simulation Simulink utilise le bloc "From Workspace" pour intégrer les données nécessaires de l'espace de travail dans la simulation. Pour une raison quelconque, cela ne fonctionne pas.

Mon code ressemble à ceci :

load DemoData
chemin = pwd;

apool = gcp('nocreate');
if isempty(apool)
    apool = parpool('local');
end

parfor k = 1 : 2
    load_system(strcat(chemin,'\\DemoMDL'))
    set_param('DemoMDL/Mask', 'DataInput', 'DemoData')

       SimOut(k) = sim('DemoMDL')
    end

delete(apool);

Ma simulation ressemble à ceci

DataFromWorkspace

Le fichier DemoData est juste une matrice de zeros(100,20). C'est un exemple de données.

Maintenant, si je simule le script, le message d'erreur suivant apparaît :

Erreurs

Erreur en utilisant DemoScript (ligne 9)

Erreur lors de l'évaluation du paramètre 'DataInput' dans 'DemoMDL/Mask'

Provqué par :

Erreur en utilisant parallel_function>make_general_channel/channel_general (ligne 907)
Erreur lors de l'évaluation du paramètre 'DataInput' dans 'DemoMDL/Mask'
    Erreur en utilisant parallel_function>make_general_channel/channel_general (ligne 907)

    Fonction ou variable 'DemoData' non définie.

Avez-vous une idée de pourquoi cela se produit ?

La chose étrange, c'est que si j'essaie d'accéder à 'DemoData' à l'intérieur de la boucle parfor, cela fonctionne. Par exemple, avec ce code :

load DemoData
chemin = pwd;

apool = gcp('nocreate');
if isempty(apool)
    apool = parpool('local');
end

parfor k = 1 : 2
    load_system(strcat(chemin,'\\DemoMDL'))
    set_param('DemoMDL/Mask', 'DataInput', 'DemoData')
    fprintf(num2str(DemoData))
end

delete(apool);

Voici ma sortie sans simuler et afficher les données

'>>'DemoScript 00000000000000000 .....

Merci beaucoup. C'est la question originale avec beaucoup plus de détails (inutiles) :

QuestionAntérieure

3voto

Phil Goddard Points 8407

Je soupçonne que le problème vient du fait que lorsque MATLAB prétraite la boucle parfor pour déterminer quelles variables doivent être transmises aux travailleurs, il ne sait pas ce qu'est DemoData. Dans votre premier exemple, c'est juste une chaîne de caractères, donc aucune donnée n'est transmise. Dans votre deuxième exemple, il sait explicitement quelle est la variable et la transmet donc.

Vous pourriez essayer d'utiliser l'Espace de travail du modèle, ou peut-être simplement insérer la ligne

DemoData = DemoData;

dans le code de la boucle parfor.

2voto

Navan Points 1866

Votre erreur est due au fait que les travailleurs n'avaient pas accès à DemoData dans l'espace de travail du client.

Lors de l'exécution de simulations parallèles avec Simulink, il serait plus facile de gérer les données de l'espace de travail si vous les déplacez vers l'espace de travail du modèle. Ensuite, chaque travailleur peut accéder à ces données depuis son espace de travail de modèle. Vous pouvez charger un fichier MAT ou écrire du code MATLAB pour initialiser les données dans l'espace de travail du modèle. Vous pouvez accéder à l'espace de travail du modèle en utilisant le menu du modèle Simulink Vue -> Explorateur de modèle -> Espace de travail du modèle.

Voir également la documentation à http://www.mathworks.com/help/simulink/ug/running-parallel-simulations.html qui parle de "Résolution des problèmes d'accès à l'espace de travail".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X