2017-09-23 66 views
0

我是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. 

如果你需要看我的代碼的任何其他部分讓我知道

注:我已經編輯了我的代碼與來自其他用戶的建議一致,但錯誤仍然存​​在

+3

理想情況下,你將建立一個[極小,完整,可驗證的示例](https://stackoverflow.com/help/mcve)。至少,請顯示你分配'array1'和'array2'的代碼。這些數組應該分配在所有**任務上,並且只填充在根任務(這裏是任務「0」) –

+0

我將用該部分更新代碼,我只是不想包含太多因爲總文件很長。就像你說的那樣,我在所有任務上分配數組,但只在一個任務上填充。 – MrRempton

+0

機會是(一旦你有*最小*但可行的例子)你可能自己找到答案 – YePhIcK

回答

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); 
+0

非常感謝!我不能相信我沒有馬上看到它,它一定是缺乏睡眠或什麼。還要感謝關於連續數組的想法!編輯:當我改變了類型,我仍然有一個seg錯誤,但在這種情況下,它能夠通過更多的數組。它仍然有幫助,並給了我一個體面的想法。 – MrRempton

+0

如果這回答了你的問題,你可以考慮upvoting和/或接受答案?如果您遇到新問題,請發出新問題。 –