Boucle de assembly en parallèle

Je fais un projet dans lequel j'ai besoin de monter 100+ périphériques de boucle et de le merge en sharepoint assembly AUFS. En guise d'observation, pour le assembly séquentiel de 90 loops, cela prend 25 secondes.

Je cherche une solution qui minimisera le time en installant des périphériques en parallèle

    Je pense que c'est évident, mais

    typeset -i M=1 while [ $M -le 102 ] do mount mysourcedevice$M targetdir$M & let M++ done wait 

    Devrait faire le travail. L' wait attendra que toutes les sous-process soient terminées, avant d'exécuter la command suivante.

    Peut-être qu'une version filetée pourrait être un peu plus rapide, vous devez ajuster vous-même les parameters mount() .

     #include <stdio.h> #include <pthread.h> #include <sys/mount.h> #include <ssortingng.h> #include <errno.h> #define DEVS 100 static void *mountt(void *d) { int i = (int)d; char loop[48], mp[48]; snprintf(loop, 47, "/dev/loop%d", i); snprintf(mp, 47, "/mnt/%d", i); if (mount(loop, mp, "ext2", MS_MGC_VAL | MS_RDONLY | MS_NOSUID, "") < 0) fprintf(stderr, "mount[%d]: failed: %s\n", i, strerror(errno)); return NULL; } int main(int argc, char **argv) { int i; pthread_t tt[DEVS]; for (i=0; i<DEVS; i++) { if (pthread_create( &tt[i], NULL, mountt, (void*)i) != 0) fprintf(stderr, "thread create[%d] failed: %s\n", i, strerror(errno)); } for (i=0; i<DEVS; i++) pthread_join(tt[i], NULL); return 0; } 

    gcc -O2 -Wall -o mountt mountt.c -lpthread

    En utilisant GNU Parallel, il ressemble à ceci:

     seq 100 | parallel -j0 mount device{} dir{} 

    Si vous avez une list de dirs:

     parallel -j0 mount device{#} {} ::: dirs* 

    Si vous avez une list d'appareils:

     parallel -j0 'mkdir -p dir{#}; mount {} dir{#}' ::: device* 

    GNU Parallel est un paralléliseur général et il est facile d'exécuter des tâches en parallèle sur la même machine ou sur plusieurs machines auxquelles vous avez access ssh. Il peut souvent replace une boucle for .

    Si vous souhaitez exécuter 32 tâches différentes sur 4 processeurs, une méthode simple de paralléliser consiste à exécuter 8 tâches sur chaque unité centrale:

    Programmation simple

    GNU Parallel génère à la place un nouveau process quand on finit – en gardant les CPU actives et en gagnant du time:

    Planification parallèle GNU

    Installation

    Si GNU Parallel n'est pas fourni pour votre dissortingbution, vous pouvez effectuer une installation personnelle qui ne nécessite pas d'access root. Cela peut se faire en 10 secondes en faisant ceci:

     (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

    Pour d'autres options d'installation, voir http://git.savannah.gnu.org/cgit/parallel.git/tree/README

    Apprendre encore plus

    Voir plus d'exemples: http://www.gnu.org/software/parallel/man.html

    Regardez les videos d'intro: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

    Parcourez le tutoriel: http://www.gnu.org/software/parallel/parallel_tutorial.html

    Inscrivez-vous à la list des courriels pour get de l'aide: https://lists.gnu.org/mailman/listinfo/parallel