2016-05-14 90 views
1

我寫了簡單的程序,與MPI和它調用MPI_Wait後崩潰:MPI_WAIT崩潰簡單的程序

MPI_Init(&argc, &argv); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

MPI_Request request; 
double test = 0; 
if (rank == 0) { 
    MPI_Isend(&test, 1, MPI_DOUBLE, 1, 2, MPI_COMM_WORLD, &request); 
} else { 
    MPI_Irecv(&test, 1, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD, &request); 
    MPI_Wait(&request, NULL); 
} 

我忽略了代碼可多次,但不明白爲什麼程序崩潰。
我正在使用Visual Studio 2010.

+0

[什麼是您的調試器告訴你(http://i.stack.imgur.com/bXdkf.jpg)? – wally

+0

@flatmouse「test.exe觸發了一個斷點」。 'Kernelbase.dll'中的Stackstrace在未知過程中結束。 –

+1

試着將'MPI_Status'作爲非空值 – Ajay

回答

2

我認爲你需要使用MPI_STATUS_IGNORE而不是NULL。 聲明:我從來沒有使用過這個庫。

https://www.mpi-forum.org/docs/mpi-2.0/mpi-20-html/node47.htm

+0

謝謝!有用!我正在關注該大學教程,我對此非常生氣:) http://www.mathcs.emory.edu/~cheung/Courses/561/Syllabus/92-MPI/async.html –

+1

@ArtemMostyaev,教程作者(s)有不同的MPI實現。打開MPI定義'MPI_STATUS_IGNORE'是一個NULL指針,所以代碼將工作。基於MPICH的MPI實現將其定義爲一個特殊的非零常數值,因此代碼失敗。當你不關心狀態時,傳遞'MPI_STATUS_IGNORE'是唯一正確的方式來使用'MPI_Wait'。 –