您好,我是MPI編程新手。我試圖將兩個矩陣相乘(一個NxN矩陣(A)和一個Nx1(B)矩陣)以得到一個結果C矩陣(Nx1)。每個進程都應該計算矩陣C中的一行(元素),但只有進程0(我的主進程)可以正確計算,因爲它似乎沒有等待其他進程完成計算。我也不確定非主過程是否正確地發回結果(或者他們甚至需要?)。這裏是我的代碼:MPI主進程不等待其他進程計算
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "mpi.h"
#define PRINT_VECS 1
#define MAX_RAND 100
#define MASTER 0
#define COLUMNS_B 1
#define N 4
void init_vec(int *vec, int len);
void print_vec(const char *label, int *vec, int len);
void init_vec(int *vec, int len)
{
int i;
for (i = 0; i < len; i++)
{
vec[i] = rand() % MAX_RAND;
}
}
void print_vec(const char *label, int *vec, int len)
{
#if PRINT_VECS
printf("%s", label);
int i;
for (i = 0; i < len; i++)
{
printf("%d ", vec[i]);
}
printf("\n\n");
#endif
}
void init_matrix(int** matrix, int rows, int cols)
{
int i,j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
matrix[i][j] = rand() % MAX_RAND;
}
}
}
void print_matrix(int** matrix, int rows, int cols)
{
int i;
for (i = 0; i < rows; i++)
{
printf("|");
int j;
for (j = 0; j < cols; j++)
{
printf("%d ", matrix[i][j]);
}
printf("|\n");
}
}
int main(int argc, char *argv[])
{
int my_rank;
int num_procs;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); //grab this process's rank
MPI_Comm_size(MPI_COMM_WORLD, &num_procs); //grab the total num of processes
int results[num_procs]; // used to store the partial sum computed
int rows, cols, colsB;
rows = N;
cols = N;
colsB = COLUMNS_B;
int **A; // N x N Matrix
int B[N]; // N x 1 Matrix
int **C; // N x 1 Matrix
double start_time; // use these for timing
double stop_time;
if (my_rank == MASTER)
{
printf("Number of processes: %d\n", num_procs);
printf("N: %d\n", N);
srand(time(NULL));
// init A
int i;
A = malloc(rows * sizeof *A);
for (i = 0; i < rows; i++)
{
A[i] = malloc(cols * sizeof *A[i]);
}
init_matrix(A, rows, cols);
printf("Matrix A:\n");
print_matrix(A, rows, cols);
// init B
init_vec(B, N);
print_vec("Matrix B:\n", B, N);
// init C
C = malloc(rows * sizeof *C);
for (i = 0; i < rows; i++)
{
C[i] = malloc(colsB * sizeof *C[i]);
}
start_time = MPI_Wtime();
}
MPI_Bcast(B, N, MPI_INT, 0, MPI_COMM_WORLD);
//MPI_Bcast(A, N, MPI_INT, 0, MPI_COMM_WORLD);
int row = my_rank;
int my_sum = 0;
int i;
if (my_rank < N)
{
for (i = 0; i < N; i++)
{
int num = A[row][i] * B[i];
my_sum = my_sum + num;
}
C[row] = &my_sum;
printf("HAI FROM PROCESS %d! I will calculate row %d. My calculation: %d\n", my_rank, row, my_sum);
}
//MPI_Gather(&C, 1, MPI_INT, results, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (my_rank == MASTER)
{
stop_time = MPI_Wtime();
printf("\nMatrix C:\n");
print_matrix(C, rows, colsB);
printf("Total time (sec): %f\n", stop_time - start_time);
}
MPI_Finalize();
return EXIT_SUCCESS;;
}
我敢肯定,我很接近,但我只是失去了一些東西。我嘗試添加一些註釋掉的語句,同時也播放A矩陣和/或調用MPI_GATHER,但似乎沒有給出任何proc以外的任何proc的結果,所以顯然我仍然做錯了什麼。下面是一些示例輸出:
Number of processes: 28
N: 4
Matrix A:
|11 30 69 24 |
|83 38 66 71 |
|68 71 27 33 |
|58 5 50 10 |
Matrix B:
1 58 81 44
HAI FROM PROCESS 0! I will calculate row 0. My calculation: 8396
Matrix C:
|8396 |
|-2107258888 |
|-2107258920 |
|-2107258888 |
Total time (sec): 0.000078
所以PROC 0被正確地計算,但我的錯誤信息是PROC 1是得到一個賽格故障,我想不通爲什麼。我得到的錯誤是: mpirun noticed that process rank 1 with PID 0 exited on signal 11 (Segmentation fault).
任何幫助將不勝感激!
爲了使這個問題可以被解析,你需要提供你沒有提供的函數,比如'init_matrix'。除此之外,你使用這個常量'MASTER',但是在你的'BCAST'中,你使用0作爲根進程。堅持一個,以防他們不一樣。更重要的是,你不會在所有進程上分配內存,只是在根上。這可能是你的程序失敗的原因之一。 – atru
此外,這是一個矩陣向量乘法..我有這個問題解決了靜態數組和一個typedef而不是malloc。發佈你的整個代碼,我們可以找出問題所在。在我使用malloc的問題中,我也在每個進程上分配數組。 Malloc返回一個指向內存位置的指針。 MPI不是共享內存協議。原則上,您的代碼可以運行在許多不同的獨立機器上的不同節點上。指向其中一臺機器上的內存位置的指針在其他機器上沒有任何意義。 – atru
@atru謝謝你的迴應!我已經添加了我的其他代碼。作爲響應,矩陣是隨機生成的,所以只有主進程正在生成它們。而'MASTER' == 0,所以我可以互換使用它們,並且不會在地方保持一致。而且我也知道B是一個矢量而不是矩陣,但我將它當作矩陣處理。因爲我知道他們正在正常工作,所以我不覺得需要包括其他方法,但我現在已經發布了它們。 – k1234