MPI 和 C 中的矩阵向量乘法
Posted
技术标签:
【中文标题】MPI 和 C 中的矩阵向量乘法【英文标题】:Matrix Vector multiplication in MPI and C 【发布时间】:2012-11-24 20:01:06 【问题描述】:我正在尝试使用 MPI 和 C 将方阵乘以向量。我必须使用 MPI_Allgather 将矩阵的所有部分发送到所有进程。这就是我目前所拥有的
#include "mpi.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#define DIM 500
int main(int argc, char *argv[])
int i, j, n;
int nlocal; /* Number of locally stored rows of A */
double *fb;
double a[DIM*DIM], b[DIM], x[DIM]; /* Will point to a buffer that stores the entire vector b */
int npes, myrank;
MPI_Status status;
MPI_Init(&argc,&argv);
/* Get information about the communicator */
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &npes);
/* Allocate the memory that will store the entire vector b */
fb = (double*)malloc(n*sizeof(double));
nlocal = n/npes;
/* Gather the entire vector b on each processor using MPI's ALLGATHER operation */
MPI_Allgather(b, nlocal, MPI_DOUBLE, fb, nlocal, MPI_DOUBLE, MPI_COMM_WORLD);
/* Perform the matrix-vector multiplication involving the locally stored submatrix */
for (i=0; i<nlocal; i++)
x[i] = 0.0;
for (j=0; j<n; j++)
x[i] += a[i*n+j]*fb[j];
free(fb);
MPI_Finalize();
//end main
好的,现在可以了!它编译但我得到一个 mpi allgather 内部错误!我也尝试过其他解决方案。
Fatal error in MPI_Allgather: Internal MPI error!, error stack:
MPI_Allgather(961).......: MPI_Allgather(sbuf=0xa1828, scount=407275437, MPI_DOU BLE, rbuf=0xf61d0008, rcount=407275437, MPI_DOUBLE, MPI_COMM_WORLD) failed
MPIR_Allgather_impl(807).:
MPIR_Allgather(766)......:
MPIR_Allgather_intra(560):
MPIR_Localcopy(357)......: memcpy arguments alias each other, dst=0xb8513d70 src =0xa1828 len=-1036763800
Fatal error in MPI_Allgather: Internal MPI error!, error stack:
MPI_Allgather(961).......: MPI_Allgather(sbuf=0xa1828, scount=407275437, MPI_DOU BLE, rbuf=0xf61d0008, rcount=407275437, MPI_DOUBLE, MPI_COMM_WORLD) failed
MPIR_Allgather_impl(807).:
MPIR_Allgather(766)......:
MPIR_Allgather_intra(560):
MPIR_Localcopy(357)......: memcpy arguments alias each other, dst=0x3cb9b840 src =0xa1828 len=-1036763800
Fatal error in MPI_Allgather: Internal MPI error!, error stack:
MPI_Allgather(961).......: MPI_Allgather(sbuf=0xa1828, scount=407275437, MPI_DOU BLE, rbuf=0xf61d0008, rcount=407275437, MPI_DOUBLE, MPI_COMM_WORLD) failed
MPIR_Allgather_impl(807).:
MPIR_Allgather(766)......:
MPIR_Allgather_intra(560):
MPIR_Localcopy(357)......: memcpy arguments alias each other, dst=0x7a857ad8 src =0xa1828 len=-1036763800
谁能帮帮我?
【问题讨论】:
a
是一个二维数组,但您访问它时就像它只有一维一样。语法应该是 a[??][??]
而不是 a[??]
,但是你用什么来代替 ??s 取决于你的数据布局。
我正在像一个维度一样访问它,因为它是通过不同进程中的行分解的。
我已经尝试过了,但仍然给我这个错误。不知道如何扭转这一局面
【参考方案1】:
您使用一维(行或列主要)访问二维数组的任何方式,
您可以将二维数组分配为a[DIM*DIM]
而不是a[DIM][DIM]
并以线性方式访问它。
这个解决方案对我有用。
【讨论】:
以上是关于MPI 和 C 中的矩阵向量乘法的主要内容,如果未能解决你的问题,请参考以下文章