我正在處理使用MPI並行化Conways的生命遊戲(在C++中)。我必須從輸入中讀取一個(非常大的)矩陣,然後逐行將它分散到各個片中,然後並行處理每個片。我遵循的想法是讓只有一個進程處理I/O的東西。特別是,從文件中讀取進程0並將初始數據保存到所說的RxC矩陣中,以便在(R/P)×C「切片矩陣」中的進程中散佈。 現在,當我執行例程MPI_Scatter時,編譯器的投訴是因爲「大矩陣」僅在第一個進程中分配。爲了使事情順利進行,我必須在整個過程中分配大矩陣,即使這些矩陣仍然是空白的。這是普通的,還是我做錯了什麼?有沒有辦法避免爲每個過程分配一個空白的,無用的矩陣? 謝謝你們!MPI_Scatter:爲什麼我必須在所有進程中分配內存?
2
A
回答
2
你不需要在任何地方分配「大矩陣」,但MPI_SCATTER
的確需要你在所有的隊伍中分配一些內存。
如果你要撒這樣的數據:
散射之前:
rank 0 - 1 2 3 4
散射後:
rank 0 - 1
rank 1 - 2
rank 2 - 3
rank 3 - 4
您需要爲每個級別一個int
分配空間(而不是全部4個)。
0
您不必在任何地方分配大矩陣,但需要在任何地方聲明大矩陣變量。試試這個:
int* big_matrix;
if(process_id == 0) {
big_matrix = (int*) malloc(big_number * sizeof(int));
// fill the big matrix with values
}
int* part_of_matrix = (int*) malloc(small_number * sizeof(int));
MPI_Scatter(big_matrix, small_number, MPI_INT, part_of_matrix, small_number, MPI_INT, 0, MPI_COMM_WORLD);
至少這是一個辦法做到這一點的C.你可能需要的big_matrix初始化爲0或東西在C++。
+0
對不起,我有疑問,不應該聲明爲'int ** big_matrix'? – Caramelleamare
相關問題
- 1. 爲什麼我必須動態分配內存給QLabel才能正常工作?
- 2. 爲什麼我必須在所有的響應中傳遞RequestContext?
- 3. 爲什麼PostgreSQL必須有所不同(方案不存在)?
- 4. 在linux中爲進程分配內存
- 5. 爲什麼我們必須將克隆分配給新變量?
- 6. 爲什麼我必須添加這些內存語句?
- 7. 爲什麼我必須使用vs2005進行InfoPath2010編程
- 8. 爲什麼我必須重新啓動Django的fastcgi進程?
- 9. 爲什麼我必須取消所有會話變量?
- 10. 爲什麼我必須在通用類
- 11. 在FXML應用程序中必須完成的所有「內務」是什麼?
- 12. 爲什麼Jetty不使用所有分配的內存?
- 13. 爲什麼COBOL必須縮進?
- 14. 爲什麼DISTINCT必須先進入MySQL?
- 15. 爲什麼我必須在Flask create_app中返回應用程序?
- 16. 爲什麼必須導入內部類?
- 17. CUDA - 我必須每次都分配和釋放內存嗎?
- 18. 爲什麼node.js進程佔用比分配內存更多的內存
- 19. 在perl中爲數組預分配內存有什麼用?
- 20. 爲什麼我必須將此節點分配給樣式表中的變量?
- 21. 內存分配:爲什麼這個C程序有效?
- 22. 爲什麼我必須點擊兩次?
- 23. 爲什麼我必須編譯JavaFX SceneBuilder?
- 24. 爲什麼我必須轉換變量?
- 25. 爲什麼我必須使用-lstdC++ fs?
- 26. 爲什麼我必須包含索引?
- 27. 爲什麼我必須使用this.canvas?
- 28. 爲什麼我必須強制AutoPostBack =「true」?
- 29. 爲什麼我必須輸入兩次?
- 30. 爲什麼我必須使用Sobel Operator?
將每個單獨的MPI過程想象成一個單獨的程序,它具有自己的變量,地址空間* *等*。如果你需要一個進程內存中的變量(比如數組),那麼你肯定必須在該進程的內存中爲它分配空間。但是,通常情況下,您不應該在每個進程的內存中爲全局數組分配空間,只能爲該數組的本地部分分配空間。用你的非常合理的程序設計,你可以將數組讀入進程0,然後發送(*消息傳遞*)片給每個將要完成工作的進程。 –