我正在处理使用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,然后发送(*消息传递*)片给每个将要完成工作的进程。 –