MPI和C中的多维数组分配 [英] MPI and multidimensional array allocation in C

查看:156
本文介绍了MPI和C中的多维数组分配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用MPI_Scatter,发送行的矩阵(动态分配),但它只发送一行,在其他的是垃圾。当我使用静态内存分配 - 一切都很好。

I'm try to use MPI_Scatter, sending rows of matrix(that are dynamically allocated), but it sending only one row, in others are junk. When I use static memory allocation - everything is good.

MPI_Init(&argc, &argv);
int **matrix, *matrix_stor, *row,rank, P;
MPI_Comm_size(MPI_COMM_WORLD, &P);
row = new int [P];
for(int i = 0; i < P; i++)
{
    row[i] = 0;
}
matrix = new int *[P];
for(int i = 0; i < P; i ++)
    matrix[i] = new int [P];

//int matrix[4][4], row[4], rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if (rank == 0){
    for(int i = 0; i < P; i++){
        for(int j = 0; j < P; j++){
            matrix[i][j] = rand()%20;
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}
cout << endl;

MPI_Scatter(&matrix[0][0], P, MPI_INT,&row[0], P, MPI_INT,0,MPI_COMM_WORLD);
for(int i = 0; i < P; i++)
    cout << row[i] << " ";
cout << endl;
free(matrix);
free(row);
MPI_Finalize();
return 0;

结果是:

源矩阵:

1 7 14 0

9 4 18 18

2 4 5 5

1 7 1 11

已接收行数:

1 7 14 0

3626672 3626800 0 0

16 1 119 -33686019

-33686019 -572662307 524296 786765

And result is:
Source matrix:
1 7 14 0
9 4 18 18
2 4 5 5
1 7 1 11
Received rows:
1 7 14 0
3626672 3626800 0 0
16 1 119 -33686019
-33686019 -572662307 524296 786765

推荐答案

这不是一个MPI问题,它是一个C和多维数组问题。

This isn't an MPI issue, it's a C and multidimensional arrays issue.

问题是在C中不能保证你分配的矩阵实际上是 P * P contiguous int s。所以当你尝试从 matrix [0] [0] 开始分散 P * P

The problem is that in C there's no guarantee that your allocated matrix is actually P*P contiguous ints. So when you try to scatter P*P ints starting at matrix[0][0], who knows what you're sending out.

此代码:

matrix = new int *[P];
for(int i = 0; i < P; i ++)
    matrix[i] = new int [P];

首先分配 P pointers- to-int,然后将每一个设置为已分配 P int的指针。但是不能保证 matrix [1] 开始于 matrix [0] 结束。如果你想做到这一点 - 你做的,对于MPI和通常为技术计算应用程序中的多d数组通常 - 你必须手动分配连续的内存块,并具有 matrix 指向它:

Allocates first an array of P pointers-to-int, and then sets each one to a pointer where has been allocated P ints. But there's no guarantee at all that matrix[1] starts where matrix[0] ends. If you want to do this - and you do, both for MPI and normally for multi-d arrays in technical computing applications generally - you have to manually allocate the contiguous block of memory and have matrix point into it:

matrix = new int *[P];
int *data = new int [P*P];
for(int i = 0; i < P; i ++)
    matrix[i] = &(data[P*i]);

然后分散应该起作用。

注意,你应该使用 delete ,而不是 free()来释放分配给 new

Note too that you should be using delete, not free(), to deallocate memory allocated with new.

这篇关于MPI和C中的多维数组分配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆