如何解决在使用动态 2D 数组进行矩阵乘法的 MPI 进行并行编程时的问题
How to fix issue while doing parallel programming with MPI for Matrix-Multiplication with dynamic 2D array?
我正在尝试使用 MPI 创建三个矩阵 a,b,c,其中 c = a*b。此外,我将这些矩阵的长度作为 N(对所有矩阵通用(,因为我必须创建一个方阵。但是,每当我在运行时输入 N 的值时,我都会收到分段错误错误,如果我在程序中输入 N 的值,那么它就可以正常工作。
我已经尝试过分散和收集,如下所示:使用 Mpi_Scatter 和 Mpi_Gather 的矩阵乘法.现在我必须动态地处理,以便可以检查程序执行它所消耗的时间。只是想通知我已经完成了这个OpenMP,这很棒,但想比较哪一个真的很好,即OpenMP或MPI。
#include <iostream>
#include <math.h>
#include <sys/time.h>
#include <stdlib.h>
#include <stddef.h>
#include "mpi.h"
int main(int argc, char *argv[])
{
int i, j, k, rank, size, tag = 99, blksz, sum = 0,N=0;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int aa[N],cc[N];
if(rank ==0)
{
std::cout << "input value of N" << 'n';
std::cin >> N;
}
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
int **a = new int*[N];
for (int i = 0; i < N; i++)
a[i] = new int[N];
int **b = new int*[N];
for (int i = 0; i < N; i++)
b[i] = new int[N];
int **c = new int*[N];
for (int i = 0; i < N; i++)
c[i] = new int[N];
if (rank == 0)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
a[i][j] =rand() % 10;
std::cout << a[i][j];
}
std::cout << 'n';
}
std::cout << 'n';
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
b[i][j] =rand() % 10;
std::cout << b[i][j];
}
std::cout << 'n';
}
}
MPI_Scatter(a, N*N/size, MPI_INT, aa, N*N/size, MPI_INT,0,MPI_COMM_WORLD);
//broadcast second matrix to all processes
MPI_Bcast(b, N*N, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
//perform vector multiplication by all processes
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
sum = sum + aa[j] * b[j][i]; //MISTAKE_WAS_HERE
}
cc[i] = sum;
sum = 0;
}
MPI_Gather(cc, N*N/size, MPI_INT, c, N*N/size, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
if (rank == 0) //I_ADDED_THIS
{
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
{
std::cout << a[i][j]<< 'n';
}
std::cout << 'n';
}
std::cout << 'n' << 'n';
}
delete *a;
delete *b;
delete *c;
}
我得到的错误是:
mpirun 注意到节点本地主机上具有 PID 3580 的进程等级 3 在信号 11 上退出(分段错误(。
我只是想在这里完成矩阵乘法。
像
这样声明数组
int **a = new int*[N];
for (int i = 0; i < N; i++)
a[i] = new int[N];
不会将其分配到连续的内存位置。将上述声明替换为以下声明之一将使应用程序正常工作。
int a[N][N]; // or
int **a=malloc(N*N*sizeof(int));
MPI_Scatter,收集等适用于具有连续内存位置的数组。
#include <iostream>
#include <math.h>
#include <sys/time.h>
#include <stdlib.h>
#include <stddef.h>
#include "mpi.h"
int main(int argc, char *argv[])
{
int i, j, k, rank, size, tag = 99, blksz, sum = 0,N=0;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank ==0)
{
std::cout << "input value of N" << 'n';
std::cin >> N;
}
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
int size_array=(N*N)/size;
int aa[size_array],cc[size_array]; // Declare arrays here since value of N is 0 otherwise
int a[N][N];
int b[N][N];
int c[N][N];
for (int i = 0; i < N; i++)
c[i] = new int[N];
if (rank == 0)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
a[i][j] =rand() % 10;
std::cout << a[i][j];
}
std::cout << 'n';
}
std::cout << 'n';
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
b[i][j] =rand() % 10;
std::cout << b[i][j];
}
std::cout << 'n';
}
}
MPI_Scatter(a, N*N/size, MPI_INT, aa, N*N/size, MPI_INT,0,MPI_COMM_WORLD);
//broadcast second matrix to all processes
MPI_Bcast(b, N*N, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
//perform vector multiplication by all processes
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
sum = sum + aa[j] * b[j][i]; //MISTAKE_WAS_HERE
}
cc[i] = sum;
sum = 0;
}
MPI_Gather(cc, N*N/size, MPI_INT, c, N*N/size, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
if (rank == 0) //I_ADDED_THIS
{
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
{
std::cout << a[i][j]<< 'n';
}
std::cout << 'n';
}
std::cout << 'n' << 'n';
}
}
还要在scanf
之后声明数组int aa[N],cc[N];
。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 如何在HPC部署C (MPI)时避免问题
- MPI 二进制文件 I/O 基本功能和性能问题
- 如何解决在使用动态 2D 数组进行矩阵乘法的 MPI 进行并行编程时的问题
- C++ MPI 发送接收问题
- MPI 新手 - 关于'mpirun'如何工作和流程管理的一些问题
- MPI 全对多通信问题
- C - MPI_Send() 和 MPI_Recv() 中的 MPI 编程解决了问题
- 与OpenMP,MPI和CUDA链接时的Autotools问题
- 可以在双Hexacore机器上打开MPI导致性能问题
- 与MPI-2单向通信同步单个int值的问题
- 同步MPI-2单向通信中的顺序问题
- MPI 中的非阻塞通信和 MPI 等待问题.并非所有信息都正确传递