MPI_Scatter: Почему я должен распределять память во всех процессах?

Я имею дело с распараллеливанием игры жизни Конвея с использованием MPI (на с ++). Я должен прочитать (очень большую) матрицу из входных данных, затем разбить ее на кусочки по строкам, а затем обработать каждый кусочек параллельно. Идея, которой я придерживаюсь, состоит в том, чтобы позволить только одному процессу иметь дело с вводом / выводом. В частности, процесс 0 считывает из файла и сохраняет исходные данные в, скажем, матрице RxC, которая будет разбросана по процессу в (R / P) xC «матрицах слайсов».
Теперь, когда я выполняю процедуру MPI_Scatter, компилятор жалуется, потому что «большая матрица» выделяется только в первом процессе. Чтобы все заработало, я должен выделить большую матрицу во всем процессе, даже если он остается пустым. Это нормально или я что-то не так делаю? Есть ли способ избежать выделения пустой, бесполезной матрицы для каждого процесса?
Спасибо вам, ребята!

2

Решение

Вам не нужно размещать «большую матрицу» везде, но MPI_SCATTER требует, чтобы вы выделяли немного памяти на все ранги.

Если вы собираетесь разбрасывать свои данные так:

До разброса:

rank 0 - 1 2 3 4

После разброса:

rank 0 - 1
rank 1 - 2
rank 2 - 3
rank 3 - 4

Вам нужно выделить место для одного int на каждый ранг (в отличие от всех 4).

2

Другие решения

Вам не нужно размещать большую матрицу везде, но большую матричную переменную нужно объявлять везде. Попробуй это:

int* big_matrix;
if(process_id == 0) {
big_matrix = (int*) malloc(big_number * sizeof(int));
// fill the big matrix with values
}
int* part_of_matrix = (int*) malloc(small_number * sizeof(int));
MPI_Scatter(big_matrix, small_number, MPI_INT, part_of_matrix, small_number, MPI_INT, 0, MPI_COMM_WORLD);

По крайней мере, это способ сделать это в C. Возможно, вам придется инициализировать big_matrix в 0 или что-то в C ++.

0

По вопросам рекламы [email protected]