我正在尝试使用MPI在C ++中编写并行代码,但是我只知道如何使用C命令(如malloc / calloc)分配内存。目的是使用身份矩阵并将其分解成MPI流程。

身份矩阵在本地工作空间上创建,然后从本地发送到要打印的等级0。

我尝试过的代码片段是:

使用C语言分配内存:


卡洛克


// N is the matrix size (N x N)
int* A=( int* )calloc( local_N*N, sizeof(int) );



分配


typedef int row[N];
row *mat;

/* Dividing the number of rows to each processor*/

int n = N / size;

mat = (row *) malloc(n * sizeof(row));


使用C ++语言分配内存:

 int**  matrix = new int *[row];


我成功地使用C编程语言运行,无论如何我想重写C ++的代码。

最佳答案

使连续数组与MPI一起使用非常方便,特别是使用连续数据进行编码要容易得多,例如制作derived data types。我的建议是使用vector并展平您的数据:

const int N = 100;
const int M = 20;
const int size = 4;
int n = N / size;
std::vector<int> mat(n*M); // each process has a mat with length of n * M
for(uint32_t i = 0; i < n; ++i)
    for(uint32_t j = 0; j < M; ++j)
        mat.at(i * M + j) = j; // this is equivalent to mat[i][j] if mat was 2D


您也可以使用smart pointer

using ManagedInt = std::unique_ptr<int[]> ;
auto managedMat = std::unique_ptr<ManagedInt[]>(new ManagedInt[n]);
for (size_t i = 0; i < n; ++i)
    managedMat[i] = ManagedInt(new int[M]);

for(uint32_t i = 0; i < n; ++i)
    for(uint32_t j = 0; j < M; ++j)
       managedMat[i][j] = j;


坏方法是:

警告您将要进入程序员领域。

// allocate mat
int **mat = new int *[n];
for (int i = 0; i < n; i++) {
    mat[i] = new int [M];
}

// now you can use mat[i][j]

// delete mat
for (int i = 0; i < n; i++) {
    delete[] mat[i];
}
delete[] mat;


godbolt

关于c++ - 如何在C++中使用MPI而不是C malloc/calloc动态分配内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56906399/

10-12 12:29
查看更多