2012-10-07 54 views
0

能否任何幫助如何使用MPI_Scatter發送下面的矩陣MPI_Scatter

float **u, **u_local; 

if (rank == 0){ 
    u = (float**) malloc(N * size * sizeof(float*)); 
    for(i = 0; i < N * size; i++){ 
     u[i] = (float*) malloc(M * sizeof(float)); 
     memset(u[i], 0, M * sizeof(float)); 
    } 
} 

我想發送U [N] [M]矩陣的所有過程同樣(u_local) N個行 列的M個

由於

回答

0

的最簡單的解決方案是在以線性方式分配存儲器:

float **u, *u_stor; 

if (rank == 0) { 
    // Watch out for possible integer overflow while computing memory size 
    u_stor = malloc(N * size * M * sizeof(float)); 
    for (i = 0; i < N * size; i++) { 
     u[i] = &u_stor[i * M]; 
    } 
    memset(u_stor, 0, N * size * M * sizeof(float)); 
} 

而不是分配的u每一行的分開,該代碼分配存儲大如整個矩陣的組塊,然後一個指針分配給u[i]i第行的u_stor開始。現在行在內存中連續放置,並且可以使用簡單的分散:

float **u_local, *u_local_stor; 
u_local_stor = malloc(N * M * sizeof(float)); 
for (i = 0; i < N; i++) 
    u_local[i] = &u_local_stor[i * M]; 

MPI_Scatter(u[0], N * M, MPI_FLOAT, 
      u_local[0], N * M, MPI_FLOAT, 
      0, MPI_COMM_WORLD);