2016-04-04 42 views
0

我在global_filetable中有4個文件路徑,我試圖將2個pilepath分散到每個進程。MPI - 將文件路徑分散到進程

0有適當的2路,但有一點很奇怪的過程中1(空)的過程...

編輯: 下面是完整的代碼:

#include <stdio.h> 
#include <limits.h> // PATH_MAX 
#include <mpi.h> 

int main(int argc, char *argv[]) 
{ 

    char** global_filetable = (char**)malloc(4 * PATH_MAX * sizeof(char)); 
    for(int i = 0; i < 4; ++i) { 
     global_filetable[i] = (char*)malloc(PATH_MAX *sizeof(char)); 
     strncpy (filetable[i], "/path/", PATH_MAX); 
    } 

    /*for(int i = 0; i < 4; ++i) { 
     printf("%s\n", global_filetable[i]); 
    }*/ 

    int rank, size; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    char** local_filetable = (char**)malloc(2 * PATH_MAX * sizeof(char)); 

    MPI_Scatter(global_filetable, 2*PATH_MAX, MPI_CHAR, local_filetable, 2*PATH_MAX , MPI_CHAR, 0, MPI_COMM_WORLD); 
    { 

     /* now all processors print their local data: */ 
     for (int p = 0; p < size; ++p) { 
      if (rank == p) { 
       printf("Local process on rank %d is:\n", rank); 
       for (int i = 0; i < 2; i++) { 
        printf("path: %s\n", local_filetable[i]); 
       } 
      } 
      MPI_Barrier(MPI_COMM_WORLD); 
     } 
    } 

    MPI_Finalize(); 
    return 0; 
} 

輸出:

Local process on rank 0 is: 
path: /path/ 
path: /path/ 
Local process on rank 1 is: 
path: (null) 
path: (null) 

你知道爲什麼我有這些空值嗎?

回答

1

首先,你的分配是不一致的:

char** local_filetable = (char**)malloc(2 * PATH_MAX * sizeof(char)); 

類型char**指示char*數組,但你分配一個連續的存儲器塊,這將指示char*

最簡單的方法是使用全局和本地filetable s的連續內存作爲char*。根據get_filetable()的實際情況,您可能需要轉換。然後,您可以簡單地分散這樣

char* entry = &filetable[i * PATH_MAX] 

:然後您可以索引像這樣

MPI_Scatter(global_filetable, 2 * PATH_MAX, MPI_CHAR, 
      local_filetable, 2 * PATH_MAX, MPI_CHAR, 0, MPI_COMM_WORLD); 

注意,沒有更多的位移,每級只得到連續內存的大小相等的塊。

下一步將定義一個封裝PATH_MAX字符的C和MPI結構,以便您可以擺脫PATH_MAX和原始索引的不斷使用。

我認爲這比使用實際的char**更好(更簡單,更少的內存管理)。如果內存浪費或冗餘數據傳輸成爲問題,您只需要這樣做。

P.S.請務必在filetable條目中輸入PATH_MAX - 1以上字符,以便爲尾部\0保留空格。

0

好吧,我很蠢。

char global_filetable[NUMBER_OF_STRINGS][PATH_MAX]; 

for(int i = 0; i < 4; ++i) { 
    strcpy (filetable[i], "/path/"); 
} 
char local_filetable[2][PATH_MAX]; 

現在它的工作原理!

+0

這與* stupid *沒有任何關係,但是理解指針,指向指針,動態內存分配和靜態二維數組的所有內容。你現在明白爲什麼它以前不工作,現在工作嗎? – Zulan