खोज…


स्पोन

मास्टर प्रक्रिया दो कार्यकर्ता प्रक्रियाओं को जन्म देती है और स्कैटर श्रमिकों को sendbuf हैं।

master.c

#include "mpi.h"

int main(int argc, char *argv[])
{ 
   int n_spawns = 2;
   MPI_Comm intercomm;

   MPI_Init(&argc, &argv);

   MPI_Comm_spawn("worker_program", MPI_ARGV_NULL, n_spawns, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm, MPI_ERRCODES_IGNORE); 

   int sendbuf[2] = {3, 5};
   int recvbuf; // redundant for master.

   MPI_Scatter(sendbuf, 1, MPI_INT, &recvbuf, 1, MPI_INT, MPI_ROOT, intercomm);

   MPI_Finalize();
   return 0;
}

worker.c

#include "mpi.h"
#include <stdio.h>

int main(int argc, char *argv[])
{  
   MPI_Init(&argc, &argv);

   MPI_Comm intercomm; 
   MPI_Comm_get_parent(&intercomm);

   int sendbuf[2]; // redundant for worker.
   int recvbuf;

   MPI_Scatter(sendbuf, 1, MPI_INT, &recvbuf, 1, MPI_INT, 0, intercomm);
   printf("recvbuf = %d\n", recvbuf);

   MPI_Finalize();
   return 0;
}

क्रियान्वयन

mpicc master.c -o master_program
mpicc worker.c -o worker_program
mpirun -n 1 master_program

दो स्वतंत्र अनुप्रयोगों के बीच संबंध स्थापित करना

मास्टर प्रक्रिया प्रत्येक अनुप्रयोग के लिए एक ही प्रक्रिया के साथ सर्वर और क्लाइंट अनुप्रयोगों को जन्म देती है। सर्वर एक पोर्ट को खोलता है और क्लाइंट उस पोर्ट से कनेक्ट होता है। तब क्लाइंट कनेक्शन स्थापित होने की पुष्टि करने के लिए MPI_Send साथ सर्वर को डेटा भेजता है।

master.c

#include "mpi.h"

int main(int argc, char *argv[])
{   
   MPI_Init(&argc, &argv);

   MPI_Comm intercomm;
   // Spawn two applications with a single process for each application.
   // Server must be spawned before client otherwise the client will complain at MPI_Lookup_name().
   MPI_Comm_spawn("server", MPI_ARGV_NULL, 1, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm, MPI_ERRCODES_IGNORE);
   MPI_Comm_spawn("client", MPI_ARGV_NULL, 1, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm, MPI_ERRCODES_IGNORE);
   
   MPI_Finalize();
   return 0;
}

server.c

#include "mpi.h"
#include <stdio.h>

int main(int argc, char *argv[])
{  
   MPI_Init(&argc, &argv);

   // Open port.
   char port_name[MPI_MAX_PORT_NAME];
   MPI_Open_port(MPI_INFO_NULL, port_name);

   // Publish port name and accept client.
   MPI_Comm client;
   MPI_Publish_name("name", MPI_INFO_NULL, port_name);
   MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &client);
   
   // Receive data from client.
   int recvbuf;
   MPI_Recv(&recvbuf, 1, MPI_INT, 0, 0, client, MPI_STATUS_IGNORE);
   printf("recvbuf = %d\n", recvbuf);

   MPI_Unpublish_name("name", MPI_INFO_NULL, port_name);

   MPI_Finalize();
   return 0;
}

client.c

#include "mpi.h"

int main(int argc, char *argv[])
{   
   MPI_Init(&argc, &argv);

   // Look up for server's port name.
   char port_name[MPI_MAX_PORT_NAME];
   MPI_Lookup_name("name", MPI_INFO_NULL, port_name);
   
   // Connect to server.
   MPI_Comm server;
   MPI_Comm_connect(port_name, MPI_INFO_NULL, 0, MPI_COMM_SELF, &server);

   // Send data to server.
   int sendbuf = 3;
   MPI_Send(&sendbuf, 1, MPI_INT, 0, 0, server);
   
   MPI_Finalize();
   return 0;
}

कमांड लाइन

mpicc master.c -o master_program
mpicc server.c -o server
mpicc client.c -o client
mpirun -n 1 master_program


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow