Как разбросать столбцы матрицы с использованием C и MPI при выполнении умножения матрицы на матрицу NxN
У меня есть проект, чтобы написать программу, которая выполняет умножение матриц на две матрицы NxN A и B. Я могу использовать любой алгоритм, но мы узнали об алгоритме Кэннона в классе, так что, вероятно, я буду его использовать.
У меня проблемы с использованием функции разброса для отправки каждого столбца B в процессор. Я прочитал другие посты на эту тему, но я все еще не совсем понимаю, как правильно использовать MPI_Type_vector, поэтому я не могу понять, что не так с моим кодом.
Вот моя попытка ниже, она дает мне ошибку сегментации:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <mpi.h>
int main(int argc, char **argv) {
int N = 10;
int i, j;
int proc_rank, world_size;
float *A, *B[N];
float *A_recv, *B_recv[N];
float *C;
MPI_Request requests[2];
MPI_Status stat;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
/* MAKE NxN MATRICES A & B */
A = (float*) malloc(N*N*sizeof(float*));
A_recv = (float*) malloc(N*sizeof(float*));
C = (float*) malloc(N*N*sizeof(float*));
for (i=0; i<N; i++) {
B[i] = (float *)malloc(N * sizeof(float));
B_recv[i] = (float *)malloc(sizeof(float));
}
if (proc_rank == 0) {
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
*(A + i*N + j) = i*0.2342 + j*0.1231;
B[i][j] = i*0.5431 + j*0.8934;
}
}
}
/* CREATE DATA TYPES FOR SCATTER */
MPI_Datatype acol, acoltype, bcol, bcoltype;
if (proc_rank == 0) {
MPI_Type_vector(10, 1, 10, MPI_FLOAT, &acol);
MPI_Type_commit(&acol);
MPI_Type_create_resized(acol, 0, 1*sizeof(float), &acoltype);
}
MPI_Type_vector(10, 1, 1, MPI_FLOAT, &bcol);
MPI_Type_commit(&bcol);
MPI_Type_create_resized(bcol, 0, 1*sizeof(float), &bcoltype);
MPI_Type_commit(&bcoltype);
/* SCATTER */
MPI_Scatter(B, 1, acoltype, B_recv, 1, bcoltype, 0, MPI_COMM_WORLD);
MPI_Scatter(A, N, MPI_FLOAT, A_recv, N, MPI_FLOAT, 0, MPI_COMM_WORLD);
/* CHECK RESULTS */
if (proc_rank == 1) {
for (i = 0; i < N; i++) {
printf("%d %f %f \n", proc_rank, A_recv[i], B_recv[i]);
}
}
if (proc_rank == 0) {
for (i = 0; i < N; i++) {
printf("%d %f %f \n", proc_rank, A[i+10], B[i][1]);
}
}
free(A);
free(B);
free(A_recv);
//free(B_recv);
free(C);
MPI_Finalize();
return 0;
}
Мне сказали, что проще всего отформатировать матрицы как массивы, где, скажем, элементы 0-9 - это строка 0, элементы 10-19 - это строка 1 и т. Д., Именно поэтому A так. Но затем примеры, которые я мог найти о том, как отправлять столбцы B, использовали его как двумерный массив, так что есть проблема, с которой они не совпадают, и это может усложнить задачу в дальнейшем.
Заранее спасибо за помощь!