我有一个简单的 MPI 应用程序,用于在输入所需值时将值从进程 0 传递到其他进程,但它会在"else"上触发断点。
我错过了什么?
#include "stdafx.h"
#include "mpi.h"
#include "stdio.h"
#include "stdlib.h"
int main(int argc, char* argv[])
{
int rank;
int value;
int size;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
do
{
if (rank == 0)
{
printf("Enter the value: ");
scanf_s("%d", &value);
MPI_Send(&value, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD);
}
else
{
MPI_Recv(&value, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD,
&status);
if (rank < size - 1)
MPI_Send(&value, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD);
}
printf("Process %d got %d ", rank, value);
} while (value >= 0);
MPI_Finalize();
return 0;
}
这是调试的输出:
'MPIHelloWorld.exe' (Win32): 加载 'C:\WINDOWS\SysWOW64\KernelBase.dll'.找不到或打开 PDB 文件。
'MPIHelloWorld.exe' (Win32): 已加载 'C:\WINDOWS\SysWOW64\gdi32.dll'.找不到或打开 PDB 文件。
'MPIHelloWorld.exe' (Win32): 已加载 'C:\Program Files (x86)\Bonjour\mdnsNSP.dll'.找不到或打开 PDB 文件。
MPIHelloWorld.exe触发了一个断点。
MPIHelloWorld.exe触发了一个断点。
线程0x3308已退出,代码为 0 (0x0)。
线程0x1dfc已退出,代码为 0 (0x0)。
线程0x2e5c已退出,代码为 0 (0x0)。
程序"[4400] MPIHelloWorld.exe"已退出,代码为 0 (0x0)。
更新:
当我按 CTRL + 5 时,我在控制台中写入此错误:
作业已中止: [ 排名 ] 在线留言
[0] 致命错误 MPI_Send中的致命错误: 无效排名的值为 1,但必须为非负值且小于 1
好的,我终于找到了答案!
我无法使用 MPI 的群集调试器,因为我正在运行 Visual Studio 2015 问题是只有 1 个进程在运行。
我打开CMD并使用"mpiexec.exe-n 4 myMpiApp.exe"运行我的应用程序,它起作用了。