2

我应该从一个处理器向另一个处理器发送一些整数,这将在我大学的 shell 服务器上完成......

首先我创建了我的解决方案代码,它看起来像(至少我是这么认为的......)

#include <stdio.h>
#include <mpi.h>

int main(int argc, char **argv)
{
    int currentRank = -1;

    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &currentRank);

    if(currentRank == 0) {
        int numberToSend = 1;
        MPI_Send(&numberToSend , 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
    }
    else if(currentRank == 1) {
        int recivedNumber;
        MPI_Recv(&recivedNumber, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf("Recived number = %d\n", recivedNumber);
    }

    MPI_Finalize();

    return 0;
}

比我应该创建一些 name.pbs 文件...并运行它。而且我不明白如何指定这个处理器数量......我尝试如下:

#PBS -l nodes=2:ppn=2 
#PBS -N cnt 
#PBS -j oe 
mpiexec ~/mpi1 

但后来仍然不知道如何处理腻子。qstatcomamnd 似乎什么都不做……只有当qstat -Qq向我显示一些“统计数据”但到处都是 0 值时……这是我在 mpi 中的第一个程序,我真的一点也不明白……

当我尝试运行我的程序时,我得到:

164900@halite:~$ ./transfer1
Fatal error in MPI_Send: Invalid rank, error stack:
MPI_Send(174): MPI_Send(buf=0x7fffd28ec640, count=1, MPI_INT, dest=1, tag=0, MPI_COMM_WORLD) failed
MPI_Send(99).: Invalid rank has value 1 but must be nonnegative and less than 1

谁能解释我如何在服务器上运行它?

4

1 回答 1

3

示例代码在这里工作正常,用 OpenMPI 和 GCC 测试,

问题是,当您运行代码时,您需要通过 mpirun 实例指定内核数量,您可能已经使用扭矩或您使用的任何调度程序正确分配了它们,但是您正在运行编译后的代码,就好像它是您需要的串行代码一样用 mpi heres 和相关输出的示例运行它

mpirun -np 2 ./example
Recived number = 1

使用不同的调度程序 hydra、PBS 或不同的 MPI 版本,您需要遵循与上述相同的模式,并且特定于您的 mpi 运行命令核心数

于 2013-01-30T03:56:16.080 回答