原题目:
用MPI设计实现矩阵-向量乘法。进程0读取矩阵和向量,并将任务分配到各个进程,最后进程0打印出计算结果。在你的主目录下,保存的文件名为matvect.c。自定义矩阵和向量大小。
#include "mpi.h"
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,rank,size,m,n,index=0;
int *a,*matrix,*local_a,*disp,*recvcounts;
MPI_Comm mm = MPI_COMM_WORLD;
MPI_Status status;
MPI_Init(NULL,NULL);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
disp = (int*)malloc(sizeof(int)*size);
recvcounts = (int*)malloc(sizeof(int)*size);
if(rank == 0)
{
printf("enter sizeof matrix(m & n):\n");//m行n列的矩阵
scanf("%d %d",&m,&n);
a = (int*)malloc(sizeof(int)*n);//向量n个数
matrix = (int*)malloc(sizeof(int)*m*n);//矩阵m*n个数
printf("enter vector:\n");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);//输入向量
}
printf("enter matrix:\n");
for(int i=0;i<m*n;i++)
{
scanf("%d",&matrix[i]);//输入矩阵
}
}
MPI_Bcast(&m,1,MPI_INT,0,mm);
MPI_Bcast(&n,1,MPI_INT,0,mm);
MPI_Bcast(a,n,MPI_INT,0,mm);//把a这个向量里面的值全部广播出去
for(i=0;i<size;i++)
{
recvcounts[i] = (m*n)/size;
if(i<(m*n)%size)
recvcounts[i]++;
disp[i] = (i>0?disp[i-1]+recvcounts[i-1]:0);
}
local_a = (int*)malloc(sizeof(int)*recvcounts[rank]);
MPI_Scatterv(matrix,recvcounts,disp,MPI_INT,local_a,recvcounts[rank],MPI_INT,0,mm);
index=disp[rank];
for(i=0;i<recvcounts[rank];i++)
{
local_a[i]*=a[(index+i)%n];
}
MPI_Gatherv(local_a,recvcounts[rank],MPI_INT,matrix,recvcounts,disp,MPI_INT,0,mm);
if(rank==0)
{
int sum=0;
for(i=0;i<m*n;i++)
{
sum+=matrix[i];
if(i%n==n-1)
{
printf("%d ",sum);
sum=0;
}
}
printf("\n");
}
MPI_Finalize();
}
程序运行:
enter sizeof matrix(m & n):
6 6
enter vector:
1 2 3 4 5 6
enter matrix:
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
91 91 91 91 91 91
root@cb81ea2c449b:/home/mpiuser# mpirun --allow-run-as-root -np 4 ./e11
enter sizeof matrix(m & n):
7 7
enter vector:
1 2 3 4 5 6 7
enter matrix:
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
140 140 140 140 140 140 140
[cb81ea2c449b:09524] *** Process received signal ***
[cb81ea2c449b:09524] Signal: Segmentation fault (11)
[cb81ea2c449b:09524] Signal code: Address not mapped (1)
[cb81ea2c449b:09524] Failing at address: 0x7ffd00000007
[cb81ea2c449b:09524] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x110c0)[0x7f935c64c0c0]
[cb81ea2c449b:09524] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x120e6c)[0x7f935c3bce6c]
[cb81ea2c449b:09524] [ 2] /usr/local/lib/libopen-pal.so.40(opal_unsetenv+0x6c)[0x7f935bd3fccc]
[cb81ea2c449b:09524] [ 3] /usr/local/lib/openmpi/mca_schizo_orte.so(+0xab8)[0x7f935a7a5ab8]
[cb81ea2c449b:09524] [ 4] /usr/local/lib/libopen-rte.so.40(orte_schizo_base_finalize+0x2f)[0x7f935c065b5f]
[cb81ea2c449b:09524] [ 5] /usr/local/lib/libopen-rte.so.40(orte_finalize+0x95)[0x7f935bffbc85]
[cb81ea2c449b:09524] [ 6] /usr/local/lib/libmpi.so.40(ompi_mpi_finalize+0x872)[0x7f935c8a3562]
[cb81ea2c449b:09524] [ 7] [cb81ea2c449b:09521] *** Process received signal ***
[cb81ea2c449b:09521] Signal: Segmentation fault (11)
[cb81ea2c449b:09521] Signal code: Address not mapped (1)
[cb81ea2c449b:09521] Failing at address: 0x7ffc00000007
[cb81ea2c449b:09521] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x110c0)[0x7f7dbfe790c0]
[cb81ea2c449b:09521] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x120e6c)[0x7f7dbfbe9e6c]
[cb81ea2c449b:09521] [ 2] /usr/local/lib/libopen-pal.so.40(opal_unsetenv+0x6c)[0x7f7dbf56cccc]
[cb81ea2c449b:09521] [ 3] /usr/local/lib/openmpi/mca_schizo_orte.so(+0xab8)[0x7f7dbdfd2ab8]
[cb81ea2c449b:09521] [ 4] /usr/local/lib/libopen-rte.so.40(orte_schizo_base_finalize+0x2f)[0x7f7dbf892b5f]
[cb81ea2c449b:09521] [ 5] /usr/local/lib/libopen-rte.so.40(orte_finalize+0x95)[0x7f7dbf828c85]
[cb81ea2c449b:09521] [ 6] /usr/local/lib/libmpi.so.40(ompi_mpi_finalize+0x872)[0x7f7dc00d0562]
[cb81ea2c449b:09521] [ 7] [cb81ea2c449b:09518] *** Process received signal ***
[cb81ea2c449b:09518] Signal: Segmentation fault (11)
[cb81ea2c449b:09518] Signal code: Address not mapped (1)
[cb81ea2c449b:09518] Failing at address: 0x7ffd00000007
[cb81ea2c449b:09518] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x110c0)[0x7f5c2c80c0c0]
[cb81ea2c449b:09518] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x120e6c)[0x7f5c2c57ce6c]
[cb81ea2c449b:09518] [ 2] /usr/local/lib/libopen-pal.so.40(opal_unsetenv+0x6c)[0x7f5c2beffccc]
[cb81ea2c449b:09518] [ 3] /usr/local/lib/openmpi/mca_schizo_orte.so(+0xab8)[0x7f5c2a965ab8]
[cb81ea2c449b:09518] [ 4] /usr/local/lib/libopen-rte.so.40(orte_schizo_base_finalize+0x2f)[0x7f5c2c225b5f]
[cb81ea2c449b:09518] [ 5] /usr/local/lib/libopen-rte.so.40(orte_finalize+0x95)[0x7f5c2c1bbc85]
[cb81ea2c449b:09518] [ 6] /usr/local/lib/libmpi.so.40(ompi_mpi_finalize+0x872)[0x7f5c2ca63562]
[cb81ea2c449b:09518] [ 7] --------------------------------------------------------------------------
Primary job terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
--------------------------------------------------------------------------
--------------------------------------------------------------------------
mpirun noticed that process rank 1 with PID 0 on node c
为什么m和n值变到了7的时候就开始崩了,前面都可以正常的求矩阵和向量的乘积