2016-08-03 18 views
1

我有一個MPI代碼的情況,許多進程將通過從各種文件中獲取各種數據來讀取許多文件和構建自己的域。大多數文件將被多個進程讀取。大多數進程將從幾個文件中讀取。我試圖找出一種方法來保持所有進程處於活動狀態。我認爲我可能會嘗試編寫代碼,以便每個進程都將循環訪問文件列表(在運行時確定,以前無法確定),嘗試使用MPI_File_open打開,然後,如果它看到其當前文件已被使用,繼續嘗試下一個文件。這個循環將繼續直到讀取所有數據。MPI_File_open:如果它找到正在使用的文件,可以放棄嗎?

但是有沒有可能使MPI_File_open這樣表現?據我所知,如果MPI_File_open看到一個文件已被使用,它只是等待,直到它可以打開它。我一直無法找到任何改變這種行爲的東西。

回答

1

看起來您可以將信息傳遞給mpi_file_open以指定在移至新文件之前等待多久。這似乎取決於實現,但從openmpi docs似乎暗示shared_file_timeout指定在返回MPI_ERR_TIMEDOUT之前文件被鎖定需要等待多長時間。像這樣的東西可以工作(我只測試過這個編譯/正確運行,當文件沒有被鎖定)。

#include "mpi.h" 
#include <stdio.h> 
#include <sys/file.h> 

int main(int argc, char *argv[]) 
{ 
    MPI_Fint handleA, handleB; 
    int rc, ec, rank; 
    MPI_File fh; 
    MPI_Info info; 

    //int fd = open("temp", O_CREAT | O_RDWR, 0666); 
    //int result = flock(fd, LOCK_EX); 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN); 
    MPI_Info_create(&info); 
    MPI_Info_set(info, "shared_file_timeout", "10.0"); 
    ec = MPI_File_open(MPI_COMM_WORLD, "temp", MPI_MODE_RDONLY, info, &fh); 
    if (ec != MPI_SUCCESS) { 
     char estring[MPI_MAX_ERROR_STRING]; 
     int len; 
     MPI_Error_string(ec, error_string, &len); 
     fprintf(stderr, "%3d: %s\n", rank, error_string); 
    } else{ 
     fprintf(stderr, "%3d: %s\n", rank, "Success"); 
    } 
    MPI_File_close(&fh); 
    MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL); 
    MPI_Finalize(); 
    return 0; 
} 

幾個音符,你可能需要設置MPI_Errhandler以確保MPI_ERR_TIMEDOUT錯誤不會導致終止。不知道如何在不同版本的mpi上實現這種便攜式,但standard似乎沒有爲這種情況指定有用的提示,並將其留給實施者。對於mpich這不起作用,只是無休止地阻塞(我看不到在mpich超時的選項)。非阻塞文件在advanced features of MPI-3正在考慮打開,所以可能不會很快。

另一種方法是簡單地檢查文件是否被鎖定在您正在使用的任何語言中,然後僅在未被鎖定時才用mpi打開。

+0

所以最後我對MPI_Info的內容有所瞭解。感謝你的回答! –

相關問題