mpi
프로세스 생성 및 관리
수색…
알
마스터 프로세스는 두 개의 작업자 프로세스를 생성하고 sendbuf
를 작업자에게 분산 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;
}
작업자
#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