2016-04-04 41 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