2015-10-15 83 views
-1

當我試圖運行一個MPI程序但失敗。它說:這些退出代碼對於MPI程序意味着什麼?

job aborted: 

[ranks] message 

[0] process exited without calling finalize 

[1-3] terminated 

錯誤分析說退出碼是0xc0000005

然後我google了一下,有人說用MPI_Init_thread代替,但它給了我255退出代碼。

我該如何解決?等級0過程有什麼問題?

下面是一個使用MPI發送和接收數據的代碼片段:

 // MPI things 
    MPI_Comm_rank(MPI_COMM_WORLD, &taskid); 
    // master 
    if (taskid == 0) 
    { 
     //printf("taskid: %d", taskid); 
     average = Nchunk/Nworkers; 
     extra = Nchunk % Nworkers; 
     mtype = FROM_MASTER; 
     offset = 0; 

     // store volume[Itemp[n]] 
     for (int i = 0; i < Nchunk; i++) 
     { 
      volumeTemp[i] = volume[Itemp[i]]; 
     } 

     // send to slave 
     for (int dest = 1; dest <= Nworkers; dest++) 
     { 

      Nelements = (dest <= extra) ? average + 1 : average; 
      MPI_Send(&Nelements, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD); 
      MPI_Send(&offset, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD); 
      MPI_Send(&Itemp[offset], Nelements, MPI_INT, dest, mtype, MPI_COMM_WORLD); 
      MPI_Send(&SMtemp[offset], Nelements, MPI_FLOAT, dest, mtype, MPI_COMM_WORLD); 
      MPI_Send(&volumeTemp[offset], Nelements, MPI_FLOAT, dest, mtype, MPI_COMM_WORLD); 
      offset = offset + Nelements; 
     } 


     // receive result from slave 
     mtype = FROM_WORKERS; 
     for (int source = 1; source <= Nworkers; source++) 
     { 
      //MPI_Recv(&average, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status); 
      //MPI_Recv(&offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status); 
      MPI_Recv(&sinogram[ns], 1, MPI_FLOAT, source, mtype, MPI_COMM_WORLD, &status); 
     } 


    } 
    //printf("taskid: %d", taskid); 

    // slave 
    if (taskid > 0) 
    { 
     //printf("taskid: %d", taskid); 
     mtype = FROM_MASTER; 
     MPI_Recv(&Nelements, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status); 
     MPI_Recv(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status); 
     MPI_Recv(&Itemp[offset], Nelements, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status); 
     MPI_Recv(&SMtemp[offset], Nelements, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status); 
     MPI_Recv(&volumeTemp, Nelements, MPI_FLOAT, MASTER, mtype, MPI_COMM_WORLD, &status); 

     for (int i = 0; i < average; i++) 
     { 
      if (fabs(volumeTemp[i]) > 1.0e-14) 
       sinogram[ns] = sinogram[ns] + volumeTemp[i] * SMtemp[i]; 
     } 

     //send to master 
     mtype = FROM_WORKERS; 
     MPI_Send(&sinogram[ns], 1, MPI_FLOAT, MASTER, mtype, MPI_COMM_WORLD, &status); 
    } 
+5

顯示代碼,它可以是任何東西。試着找出進程退出代碼的哪個位置。 –

+0

它應該是一個MCVE ... – Jeff

+0

對不起,這是我第一次發佈我的問題。我附上了一段代碼片段以使其更好 – Heran

回答

1

MPI的退出代碼很少意味着什麼,因爲你有多個流程,都返回自己的錯誤代碼。依靠程序吐出的錯誤信息更有幫助。幸運的是,你的程序完成了!

[0] process exited without calling finalize 

這可能意味着兩件事之一;

  1. 您的程序已完成,但沒有撥打MPI_Finalize。這是一個非常簡單的修復。檢查以確保您的程序可以正常終止,它會調用MPI_Finalize。這可能會也可能不是你的問題,雖然...
  2. 你的程序異常終止。這通常很難追查,並可能需要一些通常的MPI debugging技巧。如果這是問題,我們可能無法解決您的問題,除非您的代碼非常小或者您的follow the guidelines on creating a good example
+0

謝謝。我會嘗試調試。我在main()中執行MPI_Init和MPI_Finalize,並在另一個main函數中調用MPI函數。 – Heran