我正在通過使用MPI進行簡單的並行編程。在編譯期間我沒有遇到任何錯誤,但在運行時出現了一些我無法弄清楚的錯誤。請幫忙!感謝你們! 源代碼如下:C語言並行編程信號:分段錯誤:(11)11信號代碼:地址未映射(1)
#include <stdio.h>
#include <stdlib.h>
#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很多人!
如果問題是關於C,爲什麼C++標記?不要垃圾標籤! –
對不起。我只需點擊建議標籤。我現在將刪除C++標籤。 – Nick