我正在通过使用MPI进行简单的并行编程。在编译期间我没有遇到任何错误,但在运行时出现了一些我无法弄清楚的错误。请帮忙!感谢你们! 源代码如下:C语言并行编程信号:分段错误:(11)11信号代码:地址未映射(1)

#include

#include

#include "mpi.h"

#include "matrix.h"

#define MIN(X,Y) (((X) < (Y)) ? (X) : (Y)) //IMPORTANT!!

int master = 0;

int numsent, i;

int nrows, ncols;

double *A, *x, *b, *buffer;

int rowidx;

int sender;

double ans;

int main(int argc, char *argv[])

{

int myid;

int nproc;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &nproc);

MPI_Comm_rank(MPI_COMM_WORLD, &myid);

/* CODING */

MPI_Status stat; // IMPORTANT!!

//master_stage1: master obtain the matrix A and vector X

if(myid == master)

{

printf("What is the number of rows of matrix A:\n");

scanf("%d", &nrows);

printf("what is the number of columns of matrix A:\n");

scanf("%d", &ncols);

//printf("nrows = %d, ncols = %d\n", nrows, ncols);//text

A = (double*)malloc(nrows*ncols*sizeof(double));

b = (double*)malloc(nrows*sizeof(double));

ObtainMatrixAndVector(nrows, ncols, A, x, b);

}

//master_stage2:bcast x, ncols, nrows, and p2p sent rows of A

MPI_Bcast(&ncols, 1, MPI_INT, master, MPI_COMM_WORLD);

MPI_Bcast(&nrows, 1, MPI_INT, master, MPI_COMM_WORLD);

x = (double*)malloc(ncols*sizeof(double));

MPI_Bcast(x, ncols, MPI_DOUBLE, master, MPI_COMM_WORLD);

if(myid == master)

{

numsent = 0;

for(i = 1; i <= MIN(nrows, nproc - 1); i++)

{

MPI_Send(&A[(i - 1)*ncols], ncols, MPI_DOUBLE, i, i, MPI_COMM_WORLD);

numsent++;

}

//master_stage3: receiving

for(i = 0; i <= nrows; i++)

{

MPI_Recv(&ans, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);

sender = stat.MPI_SOURCE;

rowidx = stat.MPI_TAG;

b[rowidx-1] = ans;

if(numsent < nrows)

{

MPI_Send(&A[numsent*ncols], ncols, MPI_DOUBLE, sender, numsent+1, MPI_COMM_WORLD);

numsent++;

}

else

MPI_Send(buffer, ncols, MPI_DOUBLE, sender, 0, MPI_COMM_WORLD);

}

}

//Jobs Done by workers

buffer = (double*)malloc(ncols*sizeof(double));

while(1)

{

if(myid > nrows)

break;

else

{

MPI_Recv(buffer, ncols, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);

rowidx = stat.MPI_TAG;

if(rowidx == 0)

break;

ans = 0.0;

for(i = 0; i < ncols; i++)

ans += buffer[i] * x[i];

MPI_Send(&ans, 1, MPI_DOUBLE, master, rowidx, MPI_COMM_WORLD);

}

}

if(myid == master)

{

for(i = 0; i < nrows; i++)

printf("%f\n", b[i]);

}

/* CODING */

MPI_Finalize();

}

的matrix.c文件:

#include "matrix.h"

void ObtainMatrixAndVector(int m, int n, double *A, double *x, double *b)

{

// m: number of rows of matrix A

// n: number of columns of matrix A

// A: matrix of mxn

// x: vector of nx1

// b: vector of mx1 (containing exact solution for comparison purpose)

//

int i, j;

for (i = 0; i < m; i++) {

x[i] = i + 1;

for (j = 0; j < n; j++) {

A[i*n+j] = 1.0/(i+j+1); // Hilbert matrix

}

}

// exact solution b = A*x

for (i = 0; i < m; i++) {

b[i] = 0.0;

for (j = 0; j < n; j++) {

b[i] += x[j]*A[i*n+j];

}

}

}

的matrix.h:

#ifndef matrix_h

#define matrix_h

void ObtainMatrixAndVector(int m, int n, double *A, double *x, double *b);

#endif /* matrix_h */

错误:

[Nicks-MAC:02138] *** Process received signal ***

[Nicks-MAC:02138] Signal: Segmentation fault: 11 (11)

[Nicks-MAC:02138] Signal code: Address not mapped (1)

[Nicks-MAC:02138] Failing at address: 0x0

[Nicks-MAC:02138] [ 0] 0 libsystem_platform.dylib 0x00007fffbf27bbba _sigtramp + 26

[Nicks-MAC:02138] [ 1] 0 a.out 0x0000000106daf0eb x + 4147

[Nicks-MAC:02138] [ 2] 0 a.out 0x0000000106dad7a1 main + 321

[Nicks-MAC:02138] [ 3] 0 libdyld.dylib 0x00007fffbf06e255 start + 1

[Nicks-MAC:02138] *** End of error message ***

--------------------------------------------------------------------------

mpirun noticed that process rank 0 with PID 0 on node Nicks-MAC exited on signal 11 (Segmentation fault: 11).

--------------------------------------------------------------------------

谢谢你sooooooo很多人!

2017-02-10

Nick

+1

如果问题是关于C,为什么C++标记?不要垃圾标签! –

+0

对不起。我只需点击建议标签。我现在将删除C++标签。 –

更多推荐