我有一个简单的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;
}
这是从debug输出的:
'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
答案 0 :(得分:1)
好的,我终于找到了答案!
因为我正在运行Visual Studio 2015,所以我无法使用Cluster Debugger for MPI 问题是只有一个进程正在运行。
我打开CMD并使用&#34; mpiexec.exe -n 4 myMpiApp.exe&#34;运行我的应用程序。它起作用了。