如何获取MPI中的物理机数量

时间:2015-12-06 07:49:54

标签: c fortran mpi

我可以使用<video height="50%" width="100%" controls> <source src="eria.mp4" type="video/mp4"> <source src="eria.ogg" type="video/ogg"> Your browser does not support the video tag. </video> 来获取总处理器数量。 但是如何才能获得真实物理机的数量?

2 个答案:

答案 0 :(得分:6)

如果物理机是指一组处理元素,共享一个公共内存地址空间,那么MPI-3按类型分割操作{{1可用于移植获取此类机器的数量:

MPI_COMM_SPLIT_TYPE

在Fortran:

int getNodeCount(void)
{
   int rank, is_rank0, nodes;
   MPI_Comm shmcomm;

   MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0,
                       MPI_INFO_NULL, &shmcomm);
   MPI_Comm_rank(shmcomm, &rank);
   is_rank0 = (rank == 0) ? 1 : 0;
   MPI_Allreduce(&is_rank0, &nodes, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
   MPI_Comm_free(&shmcomm);
   return nodes;
}

该函数首先将世界通信器分成能够创建共享存储区域的组,即每个物理机器一组(给出上面的定义)。然后,它通过对rank-0实体的数量求和来计算这些组的数量。由于使用集体操作,该函数必须由世界组中的所有等级调用。

免责声明:未经测试的代码 - 使用风险自负。

答案 1 :(得分:1)

像这样的小功能(未经测试可能需要调整)应该这样做。它依赖于MPI_get_processor_name(),它为每个计算节点返回一个唯一的字符串。

int getNodesNumer() {
    int rank, size;
    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
    MPI_Comm_size( MPI_COMM_WORLD, &size );
    char names[size][MPI_MAX_PROCESSOR_NAME];
    int len;
    MPI_Get_processor_name( names[rank], &len );
    MPI_Allgather( MPI_IN_PLACE, 0, 0, names[0], MPI_MAX_PROCESSOR_NAME, MPI_CHAR, MPI_COMM_WORLD );
    int indexes[size];
    int count = 0;
    for ( int i = 0; i < size; i++ ) {
        int found = 0;
        for ( int j = 0; j < count; j++ ) {
            if ( strncmp( names[i], names[indexes[j]], MPI_MAX_PROCESSOR_NAME ) == 0 ) {
                found = 1;
                break;
            }
        }
        if ( found == 0 ) {
            indexes[count++] = i;
        }
    }
    return count;
}