Как динамически распределять память, используя MPI в C ++ вместо C malloc / calloc? - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь написать параллельный код на C ++, используя MPI, однако я знаю только, как распределить память с помощью команд C, например, malloc / calloc. Цель состоит в том, чтобы работать с матрицей тождества и разложить ее среди процессов MPI.

Идентификационная матрица создается в локальной рабочей области, а затем отправляется с локального номера на ранг 0. Для печати. ​​

Куски кодов, которые я пробовал:

Выделение памяти с использованием языка C:

  • calloc
// 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 ++.

1 Ответ

1 голос
/ 05 июля 2019

Очень удобно иметь непрерывный массив, работающий с MPI, особенно гораздо проще кодировать с непрерывными данными, например, сделать производные типы данных . Моя рекомендация - использовать 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

Вы также можете использовать умный указатель s:

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;

и Годболт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...