2009-07-02 7 views
3

Je cours une expérience distribuée sur plusieurs ordinateurs à l'aide de la boîte à outils Calcul parallèle. Je veux être en mesure de produire un journal de la progression de l'expérience (ou de toute erreur survenant) et enregistrer cette information dans un fichier pendant que les processus sont en cours d'exécution. Quelle est la manière standard de le faire?MATLAB parallèle et consignation

EDIT:

  1. J'utilise honteusement parallèle
  2. Je veux un seul fichier pour tous les travailleurs (j'ai un lecteur réseau accessible depuis toutes les machines)

Mon La principale préoccupation est d'avoir un dossier ouvert pour être ajouté par plusieurs travailleurs. Est-ce que je risque de perdre des messages ou d'avoir une erreur lors de l'ouverture du fichier?

+0

Êtes-vous en train de faire honteusement parallèle? Voulez-vous un fichier pour chaque travailleur, ou un seul sur l'ordinateur client. À quelle fréquence voulez-vous que ce fichier soit mis à jour, un par tâche? – MatlabDoug

Répondre

4

Lorsque plusieurs processus sont sortis dans un seul fichier, risque de rencontrer des problèmes potentiels, comme des messages écrasés ou entremêlés. J'ai eu ceci se produire avec des programmes dans d'autres langages (comme C), et supposons le même problème pourrait survenir dans MATLAB, mais j'avoue librement que je pourrais me tromper à ce sujet. En supposant que je suis pas mal ...

Si vous souhaitez fiable des données de sortie de plusieurs processus de travail à un seul fichier journal tandis que les processus sont en cours d'exécution, une façon de le faire est de faire un processus est responsable de toutes les opérations sur les fichiers (c'est-à-dire un processus "maître"). Le processus "maître" collectera des messages provenant des autres travailleurs (c'est-à-dire "esclaves") et produira ces données dans le fichier journal.

Étant donné que je ne sais pas exactement ce que fait chaque processus, il est difficile de suggérer des modifications de code spécifiques à faire. Voici quelques étapes et un exemple de code pour savoir comment procéder dans MATLAB. Ces exemples de code suppose que vous utilisez la même fonction (process_fcn) sur chaque processus:

  • Le processus « maître » doit d'abord ouvrir le fichier. Ce code (en utilisant la fonction labindex) doit être exécuté au début de process_fcn:

    if (labindex == 1), 
        fid = fopen('log.txt','at'); %# Open text file for appending 
    end 
    
  • Bien que chaque processus est en cours d'exécution, vous pouvez collecter des données qui doit être sortie du fichier journal dans une variable appelé données, qui stocke une chaîne ou un tableau de caractères. Ces données peuvent être des messages d'erreur capturés dans un try-catch block ou toute autre donnée que vous souhaitez voir figurer dans le fichier journal.

  • Aux points périodiques process_fcn (soit lorsque les tâches principales sont terminées ou dans une boucle de calcul), vous devez avoir chaque chèque de processus pour les données qui doit être sortie (c.-à-données est pas vide) et que ces données soient envoyées au processus "maître".Le processus «maître» rassemblerait et imprimerait ensuite ces messages à partir d'autres processus, ainsi que des siens. Voici un exemple de la façon dont cela pourrait être fait (en utilisant les fonctions labBarrier, labProbe, labSend et labReceive):

    labBarrier; %# All processes are synchronized here 
    if (labindex == 1), %# This is done by the "master" 
        if ~isempty(data), 
        fprintf(fid,'%s\n',data); %# Print "master" data 
        end 
        pause(1); %# Wait a moment for "slaves" to send messages 
        while labProbe, %# Loop while messages are available 
        data = labReceive; %# Get data from "slaves" 
        fprintf(fid,'%s\n',data); 
        end 
    else %# This is done by the "slaves" 
        if ~isempty(data), 
        labSend(data,1); %# Send data to the "master" 
        end 
    end 
    data = ''; %# Clear data 
    

    L'appel à PAUSE est là pour faire en sorte que les appels à labSend pour chaque « esclave » processus se produit avant que le "maître" commence à chercher des messages envoyés.

  • Enfin, le processus "maître" doit fermer le fichier. Ce code doit être exécuté à la fin de process_fcn:

    if (labindex == 1), 
        fclose(fid); 
    end 
    
+0

Je ne suis pas sûr de la fonction labBarrier (car mes travaux n'ont pas le même temps d'exécution). Mais cela me donne un bon point de départ. – Eolmar

+0

Si vos travaux ont des durées de fonctionnement très différentes, il est difficile de les synchroniser pour la sortie des données. Je ne sais pas si labSend est un appel * bloquant * (le processus attend un appel correspondant) ou un appel * non-bloquant * (le message est mis en mémoire tampon et le processus se poursuit, qu'une réception soit publiée ou non). Mon code ci-dessus suppose qu'il bloque ... si ce n'est pas bloquant, cela simplifierait probablement les choses pour vous (c.-à-d. Qu'aucun labBarrier ou PAUSE ne serait nécessaire). – gnovice

2

En supposant que vous êtes en parallèle embarrassingly (c'est la tâche et la structure des tâches) et que vous voulez que le fichier journal soit mis à jour à la fin de chaque tâche, j'utiliserais le rappel taskFinish.

Vous pouvez également écrire dans un fichier en quelque sorte au milieu de votre tâche comme vous le feriez normalement dans MATLAB, mais je pense que vous posez des questions sur les rappels à la fin de la tâche.