gaurav gupta wrote:
Hello,
I want to know that which task is running on which node. Is there any
way to know this.
Is there any profiling tool provided along with openmpi to calculate
time taken in various steps.
--
GAURAV GUPTA
B.Tech III Yr. , Department of Computer Science & Engineering
IT BHU , Varanasi
Contacts
Phone No: +91-99569-49491
e-mail :
gaurav.gu...@acm.org <mailto:gaurav.gu...@acm.org>
gaurav.gupta.cs...@itbhu.ac.in <mailto:gaurav.gupta.cs...@itbhu.ac.in>
1989.gau...@gmail.com <mailto:1989.gau...@gmail.com>
------------------------------------------------------------------------
_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users
Hi Gupta,
I ran into the same problem. In my case I wanted to define the root node
on a specific host for a synchronization step using rsync between the
hosts running the processes. Here is some linux C code that might help
you. It builds an array mpi_host with the hostname of each node, and an
index array mpi_host_rank that shows which processes are running on the
same node. The BUG, MY_MALLOC and my_printf macro's are wrappers for
C-functions assert, malloc and printf. The code assumes name-resolution
is the same on all nodes.
#define LINE_MAX 1024
#define MPI_NPROCS_MAX 256
#define INVALID (-1)
int mpi_nprocs;
int mpi_id;
int mpi_nhosts;
int mpi_root_id;
char *mpi_hosts;
char *mpi_host[MPI_NPROCS_MAX];
int mpi_host_rank[MPI_NPROCS_MAX];
int main(void)
{
int iproc;
char hostname[LINE_MAX];
mpi_nprocs = 1;
mpi_id = 0;
mpi_nhosts = 1;
mpi_root_id = 0;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &mpi_nprocs);
BUG(mpi_nprocs > MPI_NPROCS_MAX)
MPI_Comm_rank(MPI_COMM_WORLD, &mpi_id);
BUG(gethostname(hostname, LINE_MAX) != 0)
REGISTER_MALLOC(mpi_hosts, char, LINE_MAX * mpi_nprocs)
for (iproc = 0; iproc < mpi_nprocs; iproc++)
mpi_host[iproc] = mpi_hosts + iproc * LINE_MAX;
if (mpi_nprocs == 1)
strcpy(mpi_host[0], hostname);
else
MPI_Allgather(hostname, LINE_MAX, MPI_CHAR,
mpi_hosts, LINE_MAX, MPI_CHAR, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
for (iproc = 0; iproc < mpi_nprocs; iproc++)
mpi_host_rank[iproc] = INVALID;
mpi_nhosts = 0;
for (iproc = 0; iproc < mpi_nprocs; iproc++)
{
int jproc;
if (mpi_host_rank[iproc] != INVALID) continue;
++mpi_nhosts;
BUG(mpi_nhosts > mpi_nprocs)
mpi_host_rank[iproc] = mpi_nhosts - 1;
for (jproc = iproc + 1; jproc < mpi_nprocs; jproc++)
{
if (mpi_host_rank[jproc] != INVALID) continue;
if (strcasecmp(mpi_host[jproc], mpi_host[iproc]) == 0)
mpi_host_rank[jproc] = mpi_host_rank[iproc];
}
}
//find specific host if available
mpi_root_id = 0;
for (iproc = 0; iproc < mpi_nprocs; iproc++)
{
if (strcasecmp(mpi_host[iproc], "nodep140") == 0)
{
mpi_root_id = iproc;
break;
}
}
BUG(mpi_nprocs < 1)
BUG(mpi_nhosts < 1)
my_printf("hostname=%s\n", hostname);
my_printf("mpi_nprocs=%d\n", mpi_nprocs);
my_printf("mpi_id=%d\n", mpi_id);
for (iproc = 0; iproc < mpi_nprocs; iproc++)
my_printf("iproc=%d host=%s\n", iproc, mpi_host[iproc]);
my_printf("mpi_nhosts=%d\n", mpi_nhosts);
for (iproc = 0; iproc < mpi_nprocs; iproc++)
my_printf("iproc=%d host_rank=%d\n", iproc, mpi_host_rank[iproc]);
my_printf("mpi_root_id=%d host=%s host rank=%d\n",
mpi_root_id, mpi_host[mpi_root_id], mpi_host_rank[mpi_root_id]);
}