2

私は最初の MPICH2 プログラムを立ち上げ、2 台の PC の LAN で実行しました。クライアントで入力しているコマンドは次のとおりです。

root@ubuntu:/home# mpiexec -f hosts.cfg -n 4 ./hello
Hello world from process 3 of 4
Hello world from process 2 of 4
Hello world from process 1 of 4
Hello world from process 0 of 4

私のプログラムはこれです:

/* C Example */
#include <mpi.h>
#include <stdio.h>

int main (int argc, char* argv[])
{
  int rank, size;

  MPI_Init (&argc, &argv);      /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);        /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size);        /* get number of processes */
  printf( "Hello world from process %d of %d\n", rank, size );
  MPI_Finalize();
  return 0;
}

MPI_hello.c をローカルでコンパイルして、各マシンで実行可能ファイルを取得しました。

次のようなものを出力する必要があるように、コードを変更したいと思います。

Hello world from process 3 running on PC2 of 4
Hello world from process 2 running on PC2 of 4
Hello world from process 1 running on PC1 of 4
Hello world from process 0 running on PC1 of 4

PC1 と PC2 は、MPI プログラムを実行する 2 台の PC の名前です。したがって、基本的には、各プロセスとともにコンピューターの名前を取得する API を探しています。

どうすればいいですか?

アップデート

damienfrancois の両方の回答は完全にうまくいきました。ここに私の出力があります:

root@ubuntu:/home# mpiexec -f hosts.cfg -n 4 ./hello
Hello world from process 1 running on PC1 of 4
Hello world from process 3 running on PC1 of 4
Hello world from process 2 running on PC2 of 4
Hello world from process 0 running on PC2 of 4

プロセス ID の割り当てはアフィニティの問題であり、hosts.cfg ファイルで言及する必要があります。

4

1 に答える 1

2

1 つのオプションは、gethostname(2)システム コールを使用することです。

/* C Example */
#include <mpi.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

int main (int argc, char* argv[])
{
  int rank, size;
  int buffer_length = 512;
  char hostname[buffer_length];


  MPI_Init (&argc, &argv);      /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);        /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size);        /* get number of processes */

  gethostname(hostname, buffer_length); /* get hostname */

  printf( "Hello world from process %d running on %s of %d\n", rank, hostname, size );
  MPI_Finalize();
  return 0;
}

もう 1 つはMPI_Get_processor_nameを使用する方法です。

/* C Example */
#include <mpi.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

int main (int argc, char* argv[])
{
  int rank, size;
  int buffer_length = MPI_MAX_PROCESSOR_NAME;
  char hostname[buffer_length];

  MPI_Init (&argc, &argv);      /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);        /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size);        /* get number of processes */

  MPI_Get_processor_name(hostname, &buffer_length); /* get hostname */

  printf( "Hello world from process %d running on %s of %d\n", rank, hostname, size );
  MPI_Finalize();
  return 0;
}
于 2013-10-26T19:07:32.827 に答える