相关疑难解决方法(0)

使用MPI分散不同大小的矩阵块

(假设所有矩阵都按行主顺序存储.)说明问题的一个例子是在3x3网格上分布10x10矩阵,以便每个节点中子矩阵的大小看起来像

|-----+-----+-----|
| 3x3 | 3x3 | 3x4 |
|-----+-----+-----|
| 3x3 | 3x3 | 3x4 |
|-----+-----+-----|
| 4x3 | 4x3 | 4x4 |
|-----+-----+-----|
Run Code Online (Sandbox Code Playgroud)

我在Stackoverflow上看过很多帖子(例如使用MPIMPI分区矩阵将C块中的2D数组块发送到块中).但它们只处理相同大小的块(在这种情况下,我们可以简单地使用 MPI_Type_vectorMPI_Type_create_subarray只有一个MPI_Scatterv调用).

所以,我想知道在MPI中将矩阵分散到处理器网格中的最有效方法是什么,其中每个处理器都有一个具有指定大小的块.

PS我也看了MPI_Type_create_darray,但似乎没有让你为每个处理器指定块大小.

c parallel-processing message-passing distributed-computing mpi

16
推荐指数
1
解决办法
4562
查看次数

MPI_Type_create_subarray和MPI_Gather

我必须解决一个小的mpi问题.我有4个从属进程,每个进程都希望向master 0发送一个2d子阵列(CHUNK_ROWS X CHUNK_COLUMNS).Master 0收集ddd [ROWS] [COLUMNS]中的所有块并打印出来.我想使用MPI_Gather()

#include <mpi.h>
#include <iostream>
using namespace std;

#define ROWS 10
#define COLUMNS 10
#define CHUNK_ROWS 5
#define CHUNK_COLUMNS 5
#define TAG 0

int** alloca_matrice(int righe, int colonne)
{
int** matrice=NULL;
int i;

matrice = (int **)malloc(righe * sizeof(int*));

if(matrice != NULL){
  matrice[0] = (int *)malloc(righe*colonne*sizeof(int));
  if(matrice[0]!=NULL)
    for(i=1; i<righe; i++)
        matrice[i] = matrice[0]+i*colonne;
  else{
    free(matrice);
    matrice = NULL;
  }
}
else{
  matrice = NULL;
}
return matrice;

}

int main(int argc, char* argv[])
{ …
Run Code Online (Sandbox Code Playgroud)

c parallel-processing mpi

11
推荐指数
1
解决办法
7390
查看次数

使用MPI_Scatter发送矩阵的列

我正在尝试使用MPI编写矩阵向量乘法程序.我正在尝试将矩阵的列发送到单独的进程并在本地计算结果.最后我做了一个MPI_Reduce使用MPI_SUM操作.

发送矩阵的行很容易,因为C按行主顺序存储数组,但列不是(如果不逐个发送).我在这里读到了这个问题:

MPI_Scatter - 发送2D数组的列

Jonathan Dursi建议使用新的MPI数据类型,这就是我通过根据自己的需要调整代码来完成的工作:

  double matrix[10][10];
  double mytype[10][10];
  int part_size; // stores how many cols a process needs to work on
  MPI_Datatype col, coltype;
  // ...
  MPI_Type_vector(N, 1, N, MPI_DOUBLE, &col);
  MPI_Type_commit(&col);
  MPI_Type_create_resized(col, 0, 1*sizeof(double), &coltype);
  MPI_Type_commit(&coltype);
  // ...
  MPI_Scatter(matrix, part_size, coltype,
              mypart, part_size, coltype,
              0, MPI_COMM_WORLD);

  // calculations...
  MPI_Reduce(local_result, global_result,
             N, MPI_DOUBLE,
             MPI_SUM,
             0, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)

这很完美,但我不能说我真的明白它是如何工作的.

  1. 如何MPI_Type_vector存储在内存中?
  2. MPI_Type_create_resized()工作如何以及它究竟做了什么?

请记住,我是MPI的初学者.提前致谢.

c mpi

11
推荐指数
1
解决办法
8639
查看次数

使用MPI_Gather在Fortran中发送2D数组

我想使用发送2d数据块MPI_GATHER.例如:我在每个节点上有2x3阵列,如果我有4个节点,我想在root上有8x3阵列.对于1d数组,MPI_GATHER根据MPI排序对数据进行排序,但对于2d数据,它会造成混乱!

把块放好的干净方法是什么?

我期望这段代码的输出:

program testmpi
  use mpi
  implicit none
  integer :: send (2,3)
  integer :: rec (4,3)
  integer :: ierror,my_rank,i,j

  call MPI_Init(ierror)
  MPI_DATA_TYPE type_col
  ! find out process rank
  call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierror)
  if (my_rank==0) then
    send=1
    do i=1,2
      print*,(send(i,j),j=1,3)
    enddo
  endif
  if (my_rank==1) then
    send=5
    ! do 1,2
    !   print*,(send(i,j),j=1,3)
    ! enddo
  endif
  call MPI_GATHER(send,6,MPI_INTEGER,rec,6,MPI_INTEGER,0,MPI_COMM_WORLD,ierror)
  if (my_rank==0) then
    print*,'<><><><><>rec'
    do i=1,4
      print*,(rec(i,j),j=1,3)
    enddo
  endif
  call MPI_Finalize(ierror)
end program testmpi
Run Code Online (Sandbox Code Playgroud)

是这样的:

   1           1           1
   1           1 …
Run Code Online (Sandbox Code Playgroud)

fortran mpi

10
推荐指数
1
解决办法
1万
查看次数

如何使用MPI_Gatherv从包括主节点在内的不同处理器中收集不同长度的字符串?

我试图在主节点处从所有处理器(包括主节点)收集不同长度的不同字符串到单个字符串(字符数组).这是MPI_Gatherv的原型:

int MPI_Gatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
            void *recvbuf, const int *recvcounts, const int *displs,
            MPI_Datatype recvtype, int root, MPI_Comm comm)**.
Run Code Online (Sandbox Code Playgroud)

我无法确定像一些参数recvbuf,recvcountsdispls.任何人都可以在C中提供源代码示例吗?

c arrays parallel-processing mpi

4
推荐指数
1
解决办法
7138
查看次数

MPI中的动态内存分配

我是MPI的新手.我写了一个简单的代码来显示使用多个进程的矩阵.如果我有一个8x8的矩阵并用4个进程启动MPI程序,那么我的第1个进程将打印第2个2行,第2个线程将由第2个线程打印,然后将它自己分开.

#define S 8

MPI_Status status;

int main(int argc, char *argv[])
{
int numtasks, taskid;
int i, j, k = 0;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

int rows, offset, remainPart, orginalRows, height, width;
int **a;
//  int a[S][S];

if(taskid == 0)
{
    cout<<taskid<<endl;
    height = width = S;

    a = (int **)malloc(height*sizeof(int *));
    for(i=0; i<height; i++)
        a[i] =  (int *)malloc(width*sizeof(int));

    for(i=0; i<S; i++)
        for(j=0; j<S; j++)
            a[i][j] = ++k;

    rows = S/numtasks;
    offset = rows;
    remainPart = S%numtasks;

    cout<<"Num …
Run Code Online (Sandbox Code Playgroud)

c c++ mpi openmpi dynamic-memory-allocation

1
推荐指数
1
解决办法
3028
查看次数