我是MPI的新手,目前正在開發一個項目,需要我在本地beowulf集羣上進行陣列分析。我的代碼是用C編寫的,它編譯正確。它僅在使用單個進程時正確運行,但當我嘗試使用多個進程運行它時,除了根(排名0)之外的每個進程都傾向於在嘗試傳播數據時死在點附近。我的代碼看起來是這樣的當使用多個進程時MPI Bcast附近的Seg故障
//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.
如果你需要看我的代碼的任何其他部分讓我知道
注:我已經編輯了我的代碼與來自其他用戶的建議一致,但錯誤仍然存在
理想情況下,你將建立一個[極小,完整,可驗證的示例](https://stackoverflow.com/help/mcve)。至少,請顯示你分配'array1'和'array2'的代碼。這些數組應該分配在所有**任務上,並且只填充在根任務(這裏是任務「0」) –
我將用該部分更新代碼,我只是不想包含太多因爲總文件很長。就像你說的那樣,我在所有任務上分配數組,但只在一個任務上填充。 – MrRempton
機會是(一旦你有*最小*但可行的例子)你可能自己找到答案 – YePhIcK