Remarques :

Utiliser Open MPI sur Oracle Roving Edge Infrastructure

Introduction

Oracle Roving Edge Infrastructure est une plate-forme de stockage et de cloud computing robuste adaptée au déploiement en périphérie du réseau ou sur des sites avec une connectivité externe limitée ou inexistante. Alors que les charges de travail plus importantes, plus complexes et exigeantes se déplacent vers la périphérie du réseau, cela peut représenter des défis pour une infrastructure en périphérie.

Open MPI est une implémentation de la norme d'interface de transmission de message (MPI) utilisée pour développer des applications parallèles dans le calcul hautes performances (HPC). Open MPI peut être utilisé pour déployer des charges de travail de calcul haute performance et hautement parallèles sur des éléments d'infrastructure relativement plus petits qui fonctionnent ensuite comme un ensemble agrégé de ressources plus volumineux. Cette approche peut être utilisée pour distribuer une charge de travail à l'UC et à d'autres ressources de calcul telles que le GPU, ce qui permet le déploiement de tâches plus importantes et intensives en calcul à la périphérie du réseau, telles que la modélisation prédictive ou d'autres tâches d'intelligence artificielle/apprentissage automatique (IA/ML).

Open MPI peut être utilisé pour déployer des charges de travail parallèles en utilisant des ressources sur les noeuds Oracle Roving Edge Infrastructure. Netfilter fournit la traduction d'adresse réseau de destination (DNAT) et la traduction d'adresse réseau source (SNAT) nécessaires pour les instances de machine virtuelle à l'aide d'un logiciel de clustering hébergé sur les noeuds Oracle Roving Edge Infrastructure. Ce tutoriel implémente Open MPI à l'aide de Netfilter sur Oracle Roving Edge Infrastructure en exécutant un calculateur de nombre premier pour démontrer des performances améliorées lors de l'utilisation de ressources parallèles.

Informations de fond

Open MPI peut être exécuté sur plusieurs instances de machine virtuelle au sein d'un seul noeud Oracle Roving Edge Infrastructure ou sur plusieurs noeuds Oracle Roving Edge Infrastructure. L'exécution sur un seul noeud Oracle Roving Edge Infrastructure est transparente et ne pose aucun problème. Lors de l'exécution sur plusieurs noeuds Oracle Roving Edge Infrastructure, il est important de comprendre le réseau sur les instances de machine virtuelle Oracle Roving Edge Infrastructure et la façon dont Open MPI achemine le trafic pour éviter d'éventuels problèmes.

Mise en réseau sur des instances de machine virtuelle Oracle Roving Edge Infrastructure

Les instances de machine virtuelle exécutées sur Oracle Roving Edge Infrastructure utilisent des adresses IP privées pour communiquer avec d'autres instances de machine virtuelle sur le même sous-réseau hébergé sur le même noeud. Les adresses IP publiques peuvent être affectées à des instances de machine virtuelle hébergées sur Oracle Roving Edge Infrastructure pour permettre aux instances de communiquer avec d'autres sous-réseaux et ressources exécutés en dehors du noeud Oracle Roving Edge Infrastructure où elles sont hébergées.

Remarque : les adresses IP publiques sont affectées aux cartes d'interface réseau virtuelles d'instance de machine virtuelle à partir d'un pool d'adresses IP publiques. Bien que les adresses soient appelées adresses IP publiques, elles sont en réalité des adresses IP sur le réseau local sur lequel le noeud Oracle Roving Edge Infrastructure est connecté via son port RJ-45. Il peut s'agir d'une adresse IPv4 accessible à partir d'Internet ou d'adresses sur un sous-réseau privé sur le réseau local. Ces adresses sont également appelées adresses IP externes, car elles peuvent être connectées à des ressources externes au noeud sur lequel l'instance de machine virtuelle est hébergée.

Il est important de comprendre quand une instance de machine virtuelle exécutée dans un noeud Oracle Roving Edge Infrastructure tente d'accéder à des ressources en dehors du noeud, le trafic passe par l'adresse IP externe qui est acheminée dans le noeud et sort vers la connexion réseau externe.

Un exemple d'instance de machine virtuelle sur le noeud Oracle Roving Edge Infrastructure est affiché dans l'image suivante. Notez les adresses IP publiques et privées affectées.

Exemple d'instance de machine virtuelle sur un noeud Oracle Roving Edge Infrastructure

Défis liés à l'exécution d'un MPI ouvert sur plusieurs noeuds Oracle Roving Edge Infrastructure

L'utilisation d'adresses IP privées d'instance de machine virtuelle est problématique pour les logiciels de clustering, tels qu'Open MPI, lorsqu'ils sont implémentés sur plusieurs noeuds Oracle Roving Edge Infrastructure. Chaque noeud ne connaît pas les mappages d'adresses IP privées à publiques et la traduction des mappages pour les instances de machine virtuelle hébergées sur d'autres noeuds. Comme les mappages ne sont pas partagés, les paquets utilisant des adresses IP privées sont acheminés de manière incorrecte ou perdus.

Voici un exemple de ce problème avec Open MPI :

Open MPI en cours d'exécution sur les instances de machine virtuelle tentera de déterminer le meilleur chemin réseau à utiliser pour atteindre les autres membres de l'instance de machine virtuelle. Le logiciel peut examiner les interfaces locales et les adresses IP et les enregistrer avec d'autres noeuds du cluster.

Implémenter Open MPI dans Oracle Roving Edge Infrastructure

Pour traiter la nature non partagée du réseau interne d'Oracle Roving Edge Infrastructure, le logiciel Netfilter sur les instances de machine virtuelle Linux est utilisé pour réécrire les paquets réseau provenant des machines virtuelles hébergées sur d'autres noeuds Oracle Roving Edge Infrastructure et destinés à ces dernières.

Remarques concernant la conception

Dans ce tutoriel, trois noeuds Oracle Roving Edge Infrastructure Roving Edge Devices (RED) sont utilisés pour créer un cluster Open MPI. Tous les RED sont connectés à un réseau externe partagé. Chaque noeud a été configuré avec son propre pool d'adresses IP externes pour l'allocation à des instances de machine virtuelle.

Table CIDR de sous-réseau et de VCN

Nom RED CIDR VCN CIDR de sous-réseau
RED1 10/16 10/24
RED2 10/16 10/24
RED3 10/16 10/24

Cet exemple est illustré dans l'image suivante, deux configurations réseau de deux RED différents.

Exemple de VCN et de sous-réseau sur "RED1"

Exemple de VCN et de sous-réseau sur "RED2"

Public visé

Administrateurs, développeurs et utilisateurs Oracle Roving Edge Infrastructure.

Objectifs

Prérequis

Tâche 1 : créer des instances de machine virtuelle

Créez une instance de machine virtuelle dans chaque sous-réseau sur chaque RED.

Exemples d'attribution d'adresses IP :

Nom RED Nom de machine virtuelle HEURES SUPPLÉMENTAIRES Adresse IP privée de machine virtuelle Adresse IP publique de machine virtuelle
RED1 redvm1 Ubuntu 22.04 10/24 10,123
RED2 redvm2 Ubuntu 22.04 10/24 10,123
RED3 redvm3 Ubuntu 22.04 10/24 10,123

Remarque : les instances de machine virtuelle de cette tâche sont créées à l'aide d'une image exportée à partir d'Oracle Cloud Infrastructure (OCI) à l'aide d'OCI Ubuntu 22.04 LTS. Toute distribution Linux avec des packages Open MPI appropriés peut être utilisée, par exemple, Oracle Linux 8 ou 9, Fedora, etc.

Exemple de liste de machines virtuelles sur "RED3"

  1. Sur chaque RED, accédez à Compute, Instance et cliquez sur Créer une instance.

  2. Dans Créer une instance de calcul, entrez le nom, sélectionnez l'image personnalisée importée, la forme, la configuration du réseau, les clés SSH et cliquez sur Créer.

    Création d'une image de calcul sur chaque RED

Tâche 2 : installation d'un package MPI ouvert sur chaque instance de machine virtuelle

Une fois que toutes les instances de machine virtuelle ont été créées, connectez-vous à chaque instance de machine virtuelle via SSH avec la clé fournie lors du provisionnement. Les commandes suivantes conviennent à Ubuntu 22.04. Vous devrez peut-être adapter ces instructions ou inclure des référentiels de packages supplémentaires si vous utilisez une distribution Linux différente.

  1. Exécutez la commande suivante pour mettre à jour le système et réinitialiser.

    sudo apt update && sudo apt upgrade -y
    

    Cette opération peut prendre un certain temps. Une fois cette opération terminée, redémarrez l'instance.

    sudo shutdown -r now
    
  2. Connectez-vous à l'instance et installez les packages Open MPI.

    Remarque :

    • Cela entraînera un certain nombre de dépendances.

    • Le package libopenmpi-dev est uniquement requis pour compiler ultérieurement un exemple de programme à tester. Si vous n'allez pas compiler les fonctionnalités Open MPI dans des programmes, ce package n'est pas nécessaire.

    sudo apt install openmpi-bin libopenmpi-dev -y
    

Tâche 3 : configurer la traduction d'adresse réseau de destination (DNAT) et la traduction d'adresse réseau source (SNAT)

  1. Affichez les détails de chaque instance de machine virtuelle lancée et notez les adresses IP publiques privées et affectées de manière aléatoire. Accédez à Compute, Instance et cliquez sur le nom de l'instance pour en visualiser les détails.

    Exemple de machine virtuelle sur "RED3"

  2. Créez les SNAT.

    • Si nous mappons les règles SNAT pour chaque machine virtuelle d'une table, elles doivent ressembler à ce qui suit :

      SNAT En provenance de RED1 En provenance de RED2 En provenance de RED3
      Sur redvm1 S/O Entrée src 10.123.123.67 SNAT to src 10.0.2.2 Entrée src 10.123.123.101 SNAT to src 10.0.3.2
      Sur redvm2 Entrée src 10.123.123.32 SNAT to src 10.0.1.2 S/O Entrée src 10.123.123.101 SNAT to src 10.0.3.2
      Sur redvm3 Entrée src 10.123.123.32 SNAT to src 10.0.1.2 Entrée src 10.123.123.67 SNAT to src 10.0.2.2 S/O
    • Utilisez les commandes iptables pour chaque machine virtuelle.

      • Sur redvm1.

        sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access."
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2
        sudo netfilter-persistent save
        
      • Sur redvm2.

        sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access."
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2
        sudo netfilter-persistent save
        
      • Sur redvm3.

        sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access."
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2
        sudo netfilter-persistent save
        

      Remarque : ajout de la première règle (sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT) pour autoriser l'accès à partir du sous-réseau utilisé par les RED pour leurs adresses IP publiques. Sans cela (ou une règle similaire), le trafic entrant de RED vers RED est susceptible d'être abandonné par le RED récepteur. Sur ces machines virtuelles, les nouvelles règles sont conservées avec sudo netfilter-persistent save. Cependant, cette commande sera probablement autre chose si vous utilisez une distribution Linux différente.

  3. Créez les DNAT.

    • De même, si nous mappons les règles DNAT pour chaque machine virtuelle d'une table, elles doivent ressembler à ce qui suit :

      DNAT Accès à RED1 Accès à RED2 Accès à RED3
      Sur redvm1 S/O Sortie dst 10.0.2.2 DNAT to dst 10.123.123.67 Sortie dst 10.0.3.2 DNAT to dst 10.123.123.101
      Sur redvm2 Sortie dst 10.0.1.2 DNAT to dst 10.123.123.32 S/O Sortie dst 10.0.3.2 DNAT to dst 10.123.123.101
      Sur redvm3 Sortie dst 10.0.1.2 DNAT to dst 10.123.123.32 Sortie dst 10.0.2.2 DNAT to dst 10.123.123.67 S/O
    • Utilisez les commandes iptables pour chaque machine virtuelle.

      • Sur redvm1.

        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67
        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101
        sudo netfilter-persistent save
        
      • Sur redvm2.

        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32
        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101
        sudo netfilter-persistent save
        
      • Sur redvm3.

        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32
        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67
        sudo netfilter-persistent save
        

      Remarque : sur les instances de machine virtuelle, les nouvelles règles sont conservées avec sudo netfilter-persistent save.

Tâche 4 : configurer MPI en cours

Open MPI utilise SSH pour communiquer entre les membres du cluster. Il faut donc prendre quelques précautions avant de pouvoir exécuter des travaux.

  1. Open MPI utilisera les adresses IP privées de chacune des machines virtuelles, créera des entrées /etc/hosts pour chaque instance de machine virtuelle et leur adresse IP privée sur chaque instance de machine virtuelle Open MPI.

    Par exemple, l'utilisation de la configuration au-dessus de l'entrée /etc/hosts sur redvm1 contiendra les entrées suivantes :

    127.0.0.1 localhost
    127.0.1.1 redvm1  redvm1
    10.0.2.2  redvm2
    10.0.3.2  redvm3
    

    Sur redvm2, /etc/hosts contient les entrées suivantes :

    127.0.0.1 localhost
    127.0.1.1 redvm2  redvm2
    10.0.1.2  redvm1
    10.0.3.2  redvm3
    

    Sur redvm3, /etc/hosts contient les entrées suivantes :

    127.0.0.1 localhost
    127.0.1.1 redvm3  redvm3
    10.0.1.2  redvm1
    10.0.2.2  redvm2
    
  2. Nous devons également nous assurer que l'équivalence SSH existe entre chaque machine virtuelle pour qu'Open MPI puisse l'utiliser.

    Remarque : l'hypothèse ici est qu'il s'agit de nouvelles machines virtuelles qui ne contiennent pas de clés SSH existantes pour l'utilisateur Ubuntu. Si vous utilisez d'anciennes machines virtuelles pour lesquelles des clés SSH ont déjà été créées, vous devrez adapter ces instructions. Elles pourraient écraser les clés existantes et vous empêcher de les utiliser.

    1. Sur redvm1, créez une paire de clés publique ou privée (si aucune clé n'a déjà été créée). Utilisez la commande ssh-keygen comme ssh-keygen -b 4096 -t rsa (acceptez les valeurs par défaut, ne définissez pas de mot de passe pour les nouvelles clés). Cette opération génère ~/.ssh/id_rsa et ~/.ssh/id_rsa.pub.

    2. Ajoutez la nouvelle clé publique au fichier authorized_keys en exécutant cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ou en la copiant manuellement via un éditeur de texte.

    3. Copiez id_rsa et id_rsa.pub dans le répertoire ~/.ssh de l'utilisateur ubuntu sur redvm2 et redvm3. Veillez à ajouter id_rsa.pub à authorized_keys, exécutez cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys sur redvm2 et redvm3.

    4. Une fois cela fait, à partir de chaque machine virtuelle, connectez-vous à toutes les autres machines virtuelles, y compris la machine virtuelle elle-même pour vous assurer que la connectivité fonctionne et que SSH fait confiance aux autres hôtes.

      • Connexion SSH sur redvm1.

        ubuntu@redvm1:~$ ssh redvm1 date
        The authenticity of host 'redvm1 (127.0.1.1)' can't be established.
        ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
        This key is not known by any other names
        Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
        Warning: Permanently added 'redvm1' (ED25519) to the list of known hosts.
        Fri Apr  5 04:28:57 UTC 2024
        ubuntu@redvm1:~$
        ubuntu@redvm1:~$ ssh redvm2 date
        The authenticity of host 'redvm2 (10.0.2.2)' can't be established.
        ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
        This key is not known by any other names
        Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
        Warning: Permanently added 'redvm2' (ED25519) to the list of known hosts.
        Wed Jan 31 04:29:11 UTC 2024
        ubuntu@redvm1:~$
        ubuntu@redvm1:~$ ssh redvm3 date
        The authenticity of host 'redvm3 (10.0.3.2)' can't be established.
        ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
        This key is not known by any other names
        Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
        Warning: Permanently added 'redvm3' (ED25519) to the list of known hosts.
        Wed Jan 31 04:29:19 UTC 2024
        
    5. Répétez les étapes ci-dessus pour redvm2 se connectant à redvm2, redvm1 et redvm3 et redvm3 se connectant à redvm3, redvm1 et redvm2.

  3. Créez un emplacement de stockage commun pour chaque membre du cluster.

    Remarque : dans l'idéal, toutes les instances de machine virtuelle utilisant Open MPI disposeront d'un emplacement de stockage partagé. Cela peut prendre la forme de NFS, GlusterFS, OCFS2 ou d'un certain nombre d'autres solutions de système de fichiers partagés. Cela est particulièrement important si un répertoire de travail ou un jeu de données commun est nécessaire pour la charge globale.

    Un système de fichiers partagé n'est pas nécessaire pour cet exemple, mais uniquement un emplacement avec un nom commun pour nos fichiers binaires de test. Sur chaque machine virtuelle, créez l'emplacement de nom commun /mpitest.

    sudo mkdir /mpitest && sudo chown ubuntu:ubuntu /mpitest
    

    Si nous utilisons un système de fichiers partagé, le système de fichiers partagé est monté à cet emplacement sur toutes les instances de machine virtuelle.

  4. Créez un élément hostfile à utiliser avec mpirun. Pour plus d'informations, reportez-vous à la section How do I use the -hostfile option to mpirun ?.

    1. Nous allons créer deux hostfiles pour le test. Sur redvm1, en utilisant notre emplacement de nom commun /mpitest créé ci-dessus, créez un fichier /mpitest/mpihosts.txt avec le contenu suivant :

      redvm1
      redvm2
      redvm3
      
    2. Créez un fichier /mpitest/mpihosts_slots.txt avec le contenu suivant :

      redvm1 slots=1
      redvm2 slots=1
      redvm3 slots=1
      

Remarque : dans ce tutoriel, les tests seront exécutés uniquement à partir de redvm1. Il n'est donc pas nécessaire de copier ces fichiers vers redvm2 et redvm3. Si vous souhaitez également exécuter des travaux à partir d'autres machines virtuelles, vous devrez copier ces fichiers vers les autres instances de machine virtuelle ou utiliser un système de fichiers partagé approprié tel que NFS.

Tâche 5 : tester l'instance de machine virtuelle

  1. Un simple test des commandes distribuées.

    • Un test simple consiste simplement à appeler une commande telle que hostname sur tous les membres du cluster. Voici la sortie attendue exécutée sur trois noeuds avec le fichier slots=1 (mpihosts_slots.txt). La directive slots informe mpirun du nombre de processus pouvant être alloués à ce noeud plutôt que mpirun pour déterminer le nombre de processus.

      Remarque : la spécification de slots peut être nécessaire si vous utilisez des ressources limitées autres que l'UC (par exemple, les GPU) pour lesquelles vous souhaitez limiter les processus au nombre de l'autre ressource. Si vous ne le faites pas, les processus risquent d'échouer car les autres ressources ne peuvent pas être allouées.

      ubuntu@redvm1:~$ cd /mpitest
      
      ubuntu@redvm1:/mpitest$ cat mpihosts_slots.txt
      redvm1 slots=1
      redvm2 slots=1
      redvm3 slots=1
      
      ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts_slots.txt hostname
      redvm1
      redvm2
      redvm3
      
    • Exécutez le même test, mais sans spécifier le fichier slots (mpihosts.txt), mpirun détermine les UC disponibles et exécute le nombre de commandes hostname d'UC sur chaque noeud. Ces trois machines virtuelles ont 16 CPU, nous devrions donc obtenir 3 x 16 réponses (16 de chaque nom d'hôte).

      ubuntu@redvm1:/mpitest$ cat mpihosts.txt
      redvm1
      redvm2
      redvm3
      
      ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt hostname | sort | uniq -c
          16 redvm1
          16 redvm2
          16 redvm3
      
  2. Créez un binaire de test MPI ouvert.

    Pour un test approprié avec un programme qui utilise Open MPI, nous utilisons un exemple de calculateur de nombres premiers de John Burkardt. Celui-ci devra être téléchargé et compilé sur redvm1. Pour plus d'informations, voir Calculateur de nombres premiers par John Burkardt.

    ubuntu@redvm1:~$ cd /mpitest
    
    ubuntu@redvm1:/mpitest$ curl https://people.sc.fsu.edu/~jburkardt/c_src/prime_mpi/prime_mpi.c -o prime_mpi.c
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                    Dload  Upload   Total   Spent    Left  Speed
    100  4699  100  4699    0     0   2990      0  0:00:01  0:00:01 --:--:--  2991
    
    ubuntu@redvm1:/mpitest$ mpicc prime_mpi.c -o prime_mpi
    
    ubuntu@redvm1:/mpitest$ ls -l prime_mpi
    -rwxrwxr-x 1 ubuntu ubuntu 16736 Apr  5 05:38 prime_mpi
    

    Etant donné qu'un système de fichiers partagé n'est pas configuré pour le test, le binaire prime_mpi doit être copié vers redvm2 et redvm3 au même emplacement que sur redvm1. Exécutez la commande suivante .

    ubuntu@redvm1:/mpitest$ scp prime_mpi redvm2:/mpitest
    prime_mpi                                                                                                                     100%   16KB  27.4MB/s   00:00
    ubuntu@redvm1:/mpitest$ scp prime_mpi redvm3:/mpitest
    prime_mpi                                                                                                                     100%   16KB  28.3MB/s   00:00
    
  3. Pour comparer une ligne de base, exécutez un fichier binaire Open MPI autonome. Exécutez prime_mpi sans Open MPI pour une ligne de base ou une comparaison.

    ubuntu@redvm1:/mpitest$ ./prime_mpi
    31 January 2024 06:08:17 AM
    
    PRIME_MPI
      C/MPI version
    
      An MPI example program to count the number of primes.
      The number of processes is 1
    
            N        Pi          Time
    
            1         0        0.000003
            2         1        0.000000
            4         2        0.000000
            8         4        0.000000
            16         6        0.000000
            32        11        0.000001
            64        18        0.000002
          128        31        0.000022
          256        54        0.000019
          512        97        0.000066
          1024       172        0.000231
          2048       309        0.000810
          4096       564        0.002846
          8192      1028        0.010093
        16384      1900        0.037234
        32768      3512        0.137078
        65536      6542        0.515210
        131072     12251        1.932970
        262144     23000        7.243419
    
    PRIME_MPI - Master process:
      Normal end of execution.
    
    31 January 2024 06:08:27 AM
    

    Remarque : le nombre de processus est de 1 et l'exécution prend environ 10 secondes.

  4. Exécution distribuée à l'aide d'Open MPI. Exécutez prime_mpi avec Open MPI sur toutes les UC disponibles sur les trois instances de machine virtuelle à l'aide du fichier mpihosts.txt.

    ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt ./prime_mpi
    31 January 2024 06:09:02 AM
    
    PRIME_MPI
      C/MPI version
    
      An MPI example program to count the number of primes.
      The number of processes is 48
    
            N        Pi          Time
    
            1         0        0.020740
            2         1        0.000428
            4         2        0.000331
            8         4        0.000392
            16         6        0.000269
            32        11        0.000295
            64        18        0.000374
          128        31        0.000390
          256        54        0.000380
          512        97        0.000331
          1024       172        0.000351
          2048       309        0.000385
          4096       564        0.000740
          8192      1028        0.001931
        16384      1900        0.006316
        32768      3512        0.021577
        65536      6542        0.078834
        131072     12251        0.273368
        262144     23000        0.808825
    
    PRIME_MPI - Master process:
      Normal end of execution.
    
    31 January 2024 06:09:03 AM
    

    48 processus sont utilisés et leur exécution prend environ 1 seconde.

    Explorez Open MPI en exécutant le même exemple, mais avec le fichier mpihosts_slots.txt. Vous devriez voir une amélioration par rapport à l'exécution de prime_mpi autonome, mais il n'utilisera que 1 processeur sur chaque noeud (3 au total) plutôt que le complément complet sur tous les noeuds. En modifiant le nombre d'emplacements sur chaque instance de machine virtuelle, vous pouvez contrôler la distribution du travail.

Remerciements

Ressources de formation supplémentaires

Parcourez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, rendez-vous sur education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.