IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Signal fin de tâche (pour parallélisation)


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut Signal fin de tâche (pour parallélisation)
    Bonjour,

    Je ne suis pas du tout un programmeur bash mais plutôt Matlab. Cependant, j'ai un problème avec Matlab au niveau de la parallélisation des calculs (toolbox qui est vraiment catastrophique). Donc je souhaite paralléliser matlab depuis l'extérieur. J'ai écris un petit script (c'est possible que ce soit une horreur, c'est mon premier script).

    Ça fonctionne... mais pas trop
    Ce que fais ce programme, je regarde le nombre de coeurs disponibles, ensuite je créer un fichier temporaire que j’exécute (pour faire un simulacre de boucle).
    Maintenant mes problèmes :
    - je voudrais ajouter quelque chose pour que la boucle avec var1 attende que tout les taches qu'elle a lancée soient terminées (sinon je lance plusieurs matlab sur le même coeur -> pas rentable).
    - que le disown fonctionne pour de vrai (ce qui ne semble pas être le cas). Comment appliquer de façon certaine le disown à un pid particulier ? Je veux lancer une tâche en tâche de fond puis disown pour pouvoir me déconnecter de l'ordinateur distant sur lequel je travaille.
    - comment être certain que chaque matlab soit bien lancé sur un processeur différent ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #! /bin/bash
    #
    # parmat.sh   File   Nb_iteration
    #
    np=$(nproc)
    echo "nombre de processeurs disponibles : "$np
     
    nbf=$(( $2 / $np))   #number of loops on all processors
    rmd=$(expr $2 % $np) #remainder
     
    # Loop
    for var1 in $(seq 1 $nbf)
    do
       lp=$((var1 * $np - $np + 1))
       le=$(($lp + $np - 1))
       for var in $(seq $lp $le) 
       do
          echo $var
         sed s/pl_id/$var/g <$1 >temp_$var.m
         /applications/matlab/r2013a/bin/matlab -nodesktop -r temp_$var &
         #rm temp_$var.m 
         disown
       done
    #write something for the loop to wait that all matlabs finished their run.
    done
     
    # Remainder
    if [ "$rmd" -ne "0" ]
    then
       lp=$(($nbf * $np + 1))
       le=$(($lp + $rmd - 1))
       for var in $(seq $lp $le) 
       do
          echo $var
         sed s/pl_id/$var/g <$1 >temp_$var.m
         /usr/local/MATLAB/R2011b/bin/matlab -nodesktop -r temp_$var &
         #rm temp_$var.m 
         disown
       done
    fi
    Merci beaucoup !

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    En ce qui concerne la parallélisation, tu pourrais peut-être te tourner vers parallel, outil présent dans les dépôts. Puis
    Citation Envoyé par man parallel
    EXAMPLE:To convert *.wav to *.mp3 using LAME running one process per CPU core
    run:

    parallel lame {} -o {.}.mp3 ::: *.wav
    Ensuite, l'aide de disown est claire, je crois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ help disown
    disown: disown [-h] [-ar] [jobspec ...]
        Retire des tâches du shell courant.
     
        Retire chaque argument JOBSPEC de la table des tâches actives.  Sans
        JOBSPEC, le shell utilise sa propre notion de tâche courante.
     
        Options :
          -a	retirer toutes lestâches si JOBSPEC n'est pas fourni
          -h	marque chaque JOBSPEC de façon que SIGHUP ne soit pas envoyé à la tâche
        	si le shell reçoit un SIGHUP
          -r	retire seulement les tâches en cours de fonctionnement
     
        Code de sortie :
        Renvoie le code de succès à moins qu'une option ou un JOBSPEC non valable ne soit donné.
    Enfin, une tâche qui se termine renvoie un code erreur (0 si réussite). Ceci te permet de gérer la suite, si tu récupères le code retour.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Je ne suis pas sudo sur la machine qui m'intéresse... donc pas de parallel possible.

    Un programme qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #! /bin/bash
    #
    # parmat.sh   File   Nb_iteration
    #
    np=$(nproc)
    echo "nombre de processeurs disponibles : "$np
     
    nbf=$(( $2 / $np))   #number of loops on all processors
    rmd=$(expr $2 % $np) #remainder
     
    # Loop
    for var1 in $(seq 1 $nbf)
    do
       lp=$((var1 * $np - $np + 1))
       le=$(($lp + $np - 1))
       for var in $(seq $lp $le) 
       do
         cpu=$(($var - $lp))
        (
         sed s/pl_id/$var/g <$1 >temp_$var.m
         taskset -c $cpu matlab -nodesktop -r temp_$var
         ) &
       done
    sleep 10
    echo "Waiting for subshells to finish..."
    wait 
    done
     
    # Remainder
    if [ "$rmd" -ne "0" ]
    then
       lp=$(($nbf * $np + 1))
       le=$(($lp + $rmd - 1))
       for var in $(seq $lp $le) 
       do
         cpu=$(($var - $lp))
        (
         sed s/pl_id/$var/g <$1 >temp_$var.m
         taskset -c $cpu matlab -nodesktop -r temp_$var
         ) &
       done
    sleep 10
    echo "Waiting for subshells to finish..."
    wait 
    fi
     
    #Remove temp files
    for var in $(seq "1" $2)
       do
       rm temp_$var.m
    done
    Ensuite j'ai réalisé que le disown peut être directement appliqué au script bash et donc nul besoin de le faire dans chaque boucle à chaque fois que je lance la commande matlab arg

    Merci de l'aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fin de CDD pour CDI ?
    Par heydine dans le forum Contrat
    Réponses: 7
    Dernier message: 04/09/2007, 21h29
  2. Réponses: 9
    Dernier message: 18/06/2007, 10h27
  3. [ MFC] Marque fin de chaine pour CDC::TextOut
    Par Denn's dans le forum MFC
    Réponses: 3
    Dernier message: 05/06/2007, 09h49
  4. "const" en fin de ligne pour une fonction
    Par 30barrett40 dans le forum C++
    Réponses: 5
    Dernier message: 07/03/2007, 07h46
  5. Réponses: 2
    Dernier message: 08/11/2004, 22h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo