Я имею дело с распараллеливанием игры жизни Конвея с использованием MPI (на с ++). Я должен прочитать (очень большую) матрицу из входных данных, затем разбить ее на кусочки по строкам, а затем обработать каждый кусочек параллельно. Идея, которой я придерживаюсь, состоит в том, чтобы позволить только одному процессу иметь дело с вводом / выводом. В частности, процесс 0 считывает из файла и сохраняет исходные данные в, скажем, матрице RxC, которая будет разбросана по процессу в (R / P) xC «матрицах слайсов».
Теперь, когда я выполняю процедуру MPI_Scatter, компилятор жалуется, потому что «большая матрица» выделяется только в первом процессе. Чтобы все заработало, я должен выделить большую матрицу во всем процессе, даже если он остается пустым. Это нормально или я что-то не так делаю? Есть ли способ избежать выделения пустой, бесполезной матрицы для каждого процесса?
Спасибо вам, ребята!
Вам не нужно размещать «большую матрицу» везде, но MPI_SCATTER
требует, чтобы вы выделяли немного памяти на все ранги.
Если вы собираетесь разбрасывать свои данные так:
До разброса:
rank 0 - 1 2 3 4
После разброса:
rank 0 - 1
rank 1 - 2
rank 2 - 3
rank 3 - 4
Вам нужно выделить место для одного int
на каждый ранг (в отличие от всех 4).
Вам не нужно размещать большую матрицу везде, но большую матричную переменную нужно объявлять везде. Попробуй это:
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 ++.