2016-03-03 19 views
1

我已经尝试使用MPI_Get_processor_name()gethostname()来打印我已使用的所有节点。但它只返回第一个节点的名字!任何人都可以让我知道什么是问题,以及如何获得所有节点的名称?MPI程序仅在slurm脚本中执行一次

//testMPI.c 
#include <mpi.h> 
#include <stdio.h> 

int main(int argc, char** argv) { 

    MPI_Init(NULL, NULL); 
    int world_size; 
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 
    int world_rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
    char processor_name[MPI_MAX_PROCESSOR_NAME]; 
    int name_len; 
    MPI_Get_processor_name(processor_name, &name_len); 

    printf("Hello world from processor %s, rank %d" 
      " out of %d processors\n", processor_name, world_rank, world_size);} 


    MPI_Finalize(); 
} 

我已经使用了作业脚本来运行它:

#!/bin/bash 
#SBATCH --job-name=MPI-host 
#SBATCH --account=123 
#SBATCH --time=00:02:00 
#SBATCH --mem-per-cpu=3900M 
#SBATCH --ntasks-per-node=16 
#SBATCH --nodes=4 
#SBATCH --output=./output-mpi-host-test2.out 

module load intel/2015.3 
module load openmpi.intel/1.8.6 

cp $(pwd)/$1 $SCRATCH 
cd $SCRATCH 

./$1 
+0

您能否使用上述函数附上您的代码? –

+0

我编辑并放置了代码。 – Matrix

+0

...还请包括实际的输出以及它如何与预期的完全一致。虽然我猜我知道它是怎么样的。 – Zulan

回答

2

MPI程序需要使用mpiexec或批处理系统特定的命令来启动,在SLURM srun的情况。将脚本中的最后一行替换为

srun ./$1 

注意:它从作业脚本中自动获取参数。对于普通的mpiexec,您应该提供进程数量和其他参数。

+0

非常感谢Zulan。它帮助:) – Matrix

+0

嗨@Sarah如果这已经解决了你的问题,请点击复选标记,考虑[接受它](http://meta.stackexchange.com/q/5234/179419)。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 – Zulan