使用 MPI_Type_contiguous 时出现分段错误
Segmentation fault while using MPI_Type_contiguous
我正在尝试了解 MPI_Type_contiguous
的工作原理,为此我编写了代码
#include "mpi.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
int myrank;
MPI_Status status;
MPI_Datatype type;
int buffer[100];
if(myrank==0)
{
for(int i=0;i<100;i++)
{
buffer[i]=i;
}
}
MPI_Init(&argc, &argv);
MPI_Type_contiguous( 100, MPI_CHAR, &type );
MPI_Type_commit(&type);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
if (myrank == 0)
{
MPI_Send(buffer, 1, type, 1, 123, MPI_COMM_WORLD);
}
else if (myrank == 1)
{
MPI_Recv(buffer, 1, type, 0, 123, MPI_COMM_WORLD, &status);
}
if(myrank==1)
{
for(int i=0;i<100;i++)
{
printf("%d ",buffer[i]);
}
}
MPI_Finalize();
return 0;
}
但是它给我这个错误
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 11963 RUNNING AT csews20
= EXIT CODE: 139
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions
我无法理解此错误的原因,因为我无法在我的代码中找出分段错误的原因。
查看您的代码,我注意到您的数组类型是 int
而不是 char
,因此您应该使用 MPI_INT
而不是 MPI_CHAR
。此外,您需要先初始化 rank
。只要做:
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
然后使用排名。
#include "mpi.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
int myrank;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Status status;
MPI_Datatype type;
int buffer[100];
for(int i=0;i<100;i++)
{
buffer[i]=i;
}
MPI_Type_contiguous( 100, MPI_CHAR, &type );
MPI_Type_commit(&type);
if (myrank == 0)
{
MPI_Send(buffer, 1, type, 1, 123, MPI_COMM_WORLD);
}
else if (myrank == 1)
{
MPI_Recv(buffer, 1, type, 0, 123, MPI_COMM_WORLD, &status);
}
if(myrank==1)
{
for(int i=0;i<100;i++)
{
printf("%d ",buffer[i]);
}
}
MPI_Finalize();
return 0;
}
我还建议阅读以下 SO 线程 。
我正在尝试了解 MPI_Type_contiguous
的工作原理,为此我编写了代码
#include "mpi.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
int myrank;
MPI_Status status;
MPI_Datatype type;
int buffer[100];
if(myrank==0)
{
for(int i=0;i<100;i++)
{
buffer[i]=i;
}
}
MPI_Init(&argc, &argv);
MPI_Type_contiguous( 100, MPI_CHAR, &type );
MPI_Type_commit(&type);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
if (myrank == 0)
{
MPI_Send(buffer, 1, type, 1, 123, MPI_COMM_WORLD);
}
else if (myrank == 1)
{
MPI_Recv(buffer, 1, type, 0, 123, MPI_COMM_WORLD, &status);
}
if(myrank==1)
{
for(int i=0;i<100;i++)
{
printf("%d ",buffer[i]);
}
}
MPI_Finalize();
return 0;
}
但是它给我这个错误
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 11963 RUNNING AT csews20
= EXIT CODE: 139
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions
我无法理解此错误的原因,因为我无法在我的代码中找出分段错误的原因。
查看您的代码,我注意到您的数组类型是 int
而不是 char
,因此您应该使用 MPI_INT
而不是 MPI_CHAR
。此外,您需要先初始化 rank
。只要做:
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
然后使用排名。
#include "mpi.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
int myrank;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Status status;
MPI_Datatype type;
int buffer[100];
for(int i=0;i<100;i++)
{
buffer[i]=i;
}
MPI_Type_contiguous( 100, MPI_CHAR, &type );
MPI_Type_commit(&type);
if (myrank == 0)
{
MPI_Send(buffer, 1, type, 1, 123, MPI_COMM_WORLD);
}
else if (myrank == 1)
{
MPI_Recv(buffer, 1, type, 0, 123, MPI_COMM_WORLD, &status);
}
if(myrank==1)
{
for(int i=0;i<100;i++)
{
printf("%d ",buffer[i]);
}
}
MPI_Finalize();
return 0;
}
我还建议阅读以下 SO 线程