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.gupta@acm.org
gaurav.gupta.cse06@itbhu.ac.in
1989.gaurav@gmail.com

_______________________________________________ users mailing list users@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]);
}