MATLAB: SPMD et exécution asynchrone d’une routine d’optimisation

Je cherche à utiliser la fonctionnalité labSend, labReceive avec spmd dans MATLAB pour exécuter les opérations suivantes:
  1. Lab1, exécutez une routine d’optimisation globale et passez un résultat intermédiaire à Lab2
  2. Lab2, attendez le résultat intermédiaire de Lab1 (à l’aide de labProbe), une fois reçu, utilisez ce résultat et commencez une nouvelle routine d’optimisation.
  3. Lab3,4,…, n attendez le résultat précédent de Lab_n-1, une fois reçu, utilisez ce résultat et commencez une nouvelle routine d’optimisation.
Problème:
 
Warning: An incoming message was discarded from lab 1 (tag: 1)
Warning: An incoming message was discarded from lab 1 (tag: 1)
Warning: An incoming message was discarded from lab 1 (tag: 1)
Warning: An incoming message was discarded from lab 1 (tag: 1)
Warning: An incoming message was discarded from lab 1 (tag: 1)
 
Données de labSend:
 
0.4907 0.3328 0.3625 0.5843 0.3159 0.5065 0.5100
0.4984 0.3336 0.5055 0.5216 0.5268 0.5002 0.4828
0.4907 0.3328 0.3625 0.5843 0.3159 0.5065 0.5100
0.4984 0.3336 0.5055 0.5216 0.5268 0.5002 0.4828 0.5010
 
ce qui est en ordre avec 0,04907 étant le premier message envoyé via labSend.
La dernière valeur reçue de labReceive:
 
0.5055
 
ce qui signifie que les 5 derniers messages de labSend ont été ignorés.
Maintenant, la routine spmd est asynchrone car elle 1) doit initialement attendre le premier résultat intermédiaire du laboratoire précédent et 2) la routine d’optimisation s’accélère à mesure qu’elle progresse (recherche dans un domaine plus petit)
Par conséquent, les laboratoires précédents peuvent envoyer plusieurs messages avant que lab_n n’ait la possibilité de les traiter (en exécutant autre chose). En effet, lorsque le laboratoire précédent trouve un nouveau résultat intermédiaire, j’exécute labSend afin de fournir aux laboratoires suivants les données les plus à jour.
Question:
Existe-t-il un moyen de traiter (recevoir) immédiatement les données de Lab1 si je regarde Lab2 et de les stocker quelque part? Ou existe-t-il un moyen de traiter uniquement le message le plus récent? et ignorer les messages en file d’attente?
Merci de votre aide!

Meilleure réponse

  • labSendetlabReceivesont conçus pour une communication adaptée, et il n’y a pas de fonction intégrée pour recevoir uniquement le message le plus récent. Vous pourriez peut-être utiliser un modèle comme celui-ci:
     

    % receive only most recent message
    data = labReceive(src);
    while labProbe(src)
    data = labReceive(src);
    end