1. MPI_Comm_accept
menerimapermintaanuntukmembentukintercommunicatorbaru
intMPI_Comm_accept(
char *port_name,
MPI_Info info,
int root,
MPI_Commcomm,
MPI_Comm *newcomm
);
intMPI_Comm_accept(
wchar_t *port_name,
MPI_Info info,
int root,
MPI_Commcomm,
MPI_Comm *newcomm
);
Parameters
port_name
[in] nama_port (string, digunakanhanyapada root)
info
[in] implementasi-informasi yang berkaitan (handle, hanyapada root)
root
[in] barisan / derajatpadacommdari node root (integer)
comm
[in] commintracommunicator over which call is collective (handle)
newcomm
[out] intercommunicator with client as remote group (handle)
Remarks
MPI_COMM_ACCEPT
membangunkomunikasidenganklien.Sebutsajakomunikatorkolektif.Inimengembalikansebuahintercom
municator yang
memungkinkankomunikasidenganklien.Port_nameharustelahterbentukmelaluipanggilanke
MPI_OPEN_PORT.informasi string didefinisikanolehaplikasi yang dapatmemungkinkankontrol yang
lebihtepatuntukmenerimapanggilan.
Thread and Interrupt Safety
This routine is thread-safe. Iniberartibahwarutinitasdapatdenganamandigunakanolehbeberapa threads
tanpaperluuntuksetiappenggunamemberikan threads lock.
Namunrutinitasinitidakselamanyaaman.Biasanyainidisebabkankarenapenggunaanalokasimemorisepert
imallocatauaktivitasruntime non-MPICH lainnya yang tidakaman.
2. Notes for Fortran
Semuarutinitas MPI dalamFortran (kecualiuntuk MPI_WTIME dan MPI_WTICK)
memilikiierrargumentambahan di akhirdaftarargumen. IERR adalah integer danmemilikiarti yang
samadengannilaikembalidarirutinitasdalam C. Dalam Fortran, rutinitas MPI adalahsubrutin,
dandipanggildenganinstruksipanggilan (statement)
All MPI objects (e.g., MPI_Datatype, MPI_Comm) are of type INTEGER in Fortran.
Errors
Semuarutinitas MPI (kecualiMPI_WtimedanMPI_Wtick) mengembalikannilai error. Rutinitas C
sebagainilaidarifungsidanrutinitasFortranpada argument terakhir. Sebelumnilaidikembalikan,
penangan error akandipanggil. Secara default, pembatalanpenanganan error adalahtugasdari
MPI.Penanganankesalahandapatdiubahdengan :MPI_Comm_set_errhandler (for communicators),
MPI_File_set_errhandler (for files),
MPI_Win_set_errhandler (for RMA windows).
Rutinitas MPI-1 MPI_Errhandler_setdapatdigunakan, tetapipenggunaanyasudahditinggalkan,
Penanganankesalahan MPI_ERRORS_RETURN digunakankarenanilaierordapatdikembalikan. MPI
tidakmenjaminbahwasebuah program MPI dapatberlanjutdalamdengan error sebelumnya,
namunimplementasidari MPI akanmengusahakanjikaadakemungkinan.
MPI_SUCCESS
No error; MPI routine completed successfully.
MPI_ERR_INFO
Invalid Info
MPI_ERR_COMM
Invalid communicator.Sebuahkesalahanumumadalahdenganmenggunakankomunikator null
dalampanggilan (bahkantidakdiperbolehkandalamMPI_Comm_rank).
Example Code
DibawahiniadalahilustrasidariMPI_Comm_accept.
#include "mpi.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>/* Sleep */
3. /* TesinimemeriksauntukmemastikanbahwakeduaMPI_Comm_connectsuntukdua port yang
berbedasesuaidengan MPI MPI_Comm_acceptsterkait . Proses root membukadua port MPI
danmengirimkan port pertamauntuk proses 1 dan proses 2 kedua. Kemudian, proses
akarmenerimakoneksidari port keduadiikutioleh port pertama. Proses 1 dan 2 keduanyaterhubungkeroot
,tetapi proses ke-2 pertama kali akansleepselama 3 detikuntukmemberikan proses 1
waktuuntukmenghubungkankeroot. Root harusmenunggu*sampai proses 2
menghubungkansebelummenerimakoneksidari proses 1.*/
int main( intargc, char *argv[] )
{
intnum_errors = 0;
int rank, size;
char port1[MPI_MAX_PORT_NAME];
char port2[MPI_MAX_PORT_NAME];
MPI_Status status;
MPI_Comm comm1, comm2;
int data = 0;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (size < 3)
{
printf("Three processes needed to run this test.n");fflush(stdout);
MPI_Finalize();
return 0;
}
if (rank == 0)
{
printf("0: opening ports.n");fflush(stdout);
MPI_Open_port(MPI_INFO_NULL, port1);
MPI_Open_port(MPI_INFO_NULL, port2);
printf("opened port1: <%s>n", port1);
printf("opened port2: <%s>n", port2);fflush(stdout);
MPI_Send(port1, MPI_MAX_PORT_NAME, MPI_CHAR, 1, 0, MPI_COMM_WORLD);
MPI_Send(port2, MPI_MAX_PORT_NAME, MPI_CHAR, 2, 0, MPI_COMM_WORLD);
printf("accepting port2.n");fflush(stdout);
MPI_Comm_accept(port2, MPI_INFO_NULL, 0, MPI_COMM_SELF, &comm2);
printf("accepting port1.n");fflush(stdout);
MPI_Comm_accept(port1, MPI_INFO_NULL, 0, MPI_COMM_SELF, &comm1);
MPI_Close_port(port1);
MPI_Close_port(port2);
printf("sending 1 to process 1.n");fflush(stdout);
data = 1;
MPI_Send(&data, 1, MPI_INT, 0, 0, comm1);
printf("sending 2 to process 2.n");fflush(stdout);