我是MPI的新手,我目前正在开展一个项目,要求我在我的本地beowulf集群上进行数组分析。我的代码是用C语言编写的,它可以正确编译。它仅在使用单个进程时才能正常运行,但是当我尝试使用多个进程运行它时,除了根(等级0)之外的每个进程在我尝试广播我的数据时都会在该点附近死亡。我的代码看起来像这样
//1. Initialize global variables
//2. Initialize MPI, get number of processes, get rank
//3. All processes create two dimensional arrays
array1 = (char **) malloc(sizeArray1 * sizeof(char *));
array1[0] = (char *) malloc(sizeArray1 * lineLength * sizeof(char));
for(i = 1; i < sizeArray1; i++)
{
array1[i] = array1[i - 1] + lineLength;
}
//4. Only server will populate it's arrays, then broadcast to all processes
if(rank == 0)
{
f = fopen("path..../testFile1.txt", "r");
if(NULL == f) {
perror("FAILED: ");
return -1;
}
numWords = 0;
while(err != EOF && numWords < sizeArray2)
{
err = fscanf(f, "%[^\n]\n", array2[numWords]);
numWords ++;
}
fclose(f);
}
//5. Broadcast each line from both arrays to all processes
MPI_Bcast(array1, sizeArrray1 * lineLength, MPI_CHAR, 0, MPI_COMM_WORLD);
//6. do further work on arrays
根节点将完美地完成所有这些,而其他节点通常会尝试广播一次,打印一行,然后死掉。我得到的确切错误是
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: 0x37
malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
如果您需要查看我的代码中的任何其他部分,请告诉我
注意:我编辑了我的代码以符合其他用户的建议,但错误仍然存在
答案 0 :(得分:0)
因此,您的数组由char
而非int
组成。
所以你应该MPI_Bcast()
MPI_CHAR
而不是MPI_INT
。
例如
MPI_Bcast(&(array1[i][0]), lineLength, MPI_CHAR, 0, MPI_COMM_WORLD);
作为一种风格问题,您也可以将其写为
MPI_Bcast(array1[i], lineLength, MPI_CHAR, 0, MPI_COMM_WORLD);
此外,您可能希望在一个块中分配array1
,因此您可以通过一次调用MPI_Bcast()
(这通常更有效)
分配看起来像
array1 = (char **)malloc(sizeArray1 * sizeof(char *);
array1[0] = (char *)malloc(sizeArray1 * lineLength * sizeof(char));
for (int i=1; i<sizeArray1; i++) array1[i] = array1[i-1] + lineLength;
然后
MPI_Bcast(array1, sizeArray1 * lineLength, MPI_CHAR, 0, MPI_COMM_WORLD);