1
我有一個有點問題與並行讀取如何從與MPI的文本文件和讀取整數C++
我有一個文本文件,它看起來像這樣:
1 4 30 46
0 2 3 29
1 11 12 -1
1 4 5 -1
0 3 13 14
3 6 7 8
5 10 -1 -1
13 10 -1 -1
5 9 27 -1
和我「M試圖在每個處理的時間來讀取這些整數4,文件的行的數量等於工序的數量和每行包含4個整數
int bufsize, count;
int *buf;
MPI::Status status;
MPI::File top = MPI::File::Open(MPI::COMM_WORLD, "top.txt", MPI::MODE_RDONLY, MPI::INFO_NULL);
MPI::Offset filesize = top.Get_size();
filesize = filesize/sizeof(int);
bufsize = filesize/wasteland_size + 1;
buf = new int[bufsize * sizeof(int)];
top.Set_view(my_rank * bufsize * sizeof(int), MPI_INT, MPI_INT, "native", MPI::INFO_NULL);
top.Read(buf, bufsize, MPI_INT, status);
count = status.Get_count(MPI_INT);
top.Close();
這是我使用的代碼。
它編譯沒有錯誤或警告,但它輸出的東西線:
540287025 874524723 805969974 857748000
每個進程。
這裏你會遇到問題,因爲你的線條長度不一樣;有8,9,10,11和12個字符的行。因此,簡單地將文件大小除以處理器數量(或其他數據)並將其讀入是不太可能的。您可以使用與此答案相同的方法(http://stackoverflow.com/a/12942718/463827)來劃分文件,並在後處理步驟中根據需要執行任何負載平衡。但是一般來說,文本文件對於並行I/O來說並不好。 –
我從另一個創建該文件,因爲我需要它被格式化爲這樣(我正在讀圖中的節點的鄰居),所以我可以修改它,但我不知道是什麼樣的文件使用,所以我可以正確讀取它,我應該使它二進制?什麼是在這種情況下使用的最佳文件類型? –
我會:(一)創建它作爲一個二進制文件; (b)對它進行預處理,在運行之前將其分割成正確數量的子文件(例如'split -lines = N top.txt',其中N是每個處理器的行數)並讓每個處理器讀取它自己的文件;或者,如果文件不是很大,(c)用一個處理器讀取它,然後使用'MPI_Scatter()'或'MPI_Scatterv()'分發數據。我們可能可以一起拼湊一些能夠在相關答案中使用MPI-IO的方法,但除非有其他一些令人信服的理由,否則我傾向於認爲這會比它的價值更麻煩。 –