c++ - 带有 std::vector 的 MPI_Scatter 和 MPI_Gather
问题描述
我是 MPI 编程的新手。我正在使用 C++,因为我想使用向量而不是数组(因此用户可以动态选择游戏网格的大小(康威的生命游戏),而不是硬编码的数组大小)。
假设:有 4 个进程 ( p = 4
)
这是我的代码:
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
vector<CELL> *gameBoard = NULL;
if (rank == 0)
{
//create the gameboard on just the root process
gameBoard = new vector<CELL>();
gameBoard->resize(16);
}
//create a partialGrid on EACH process
vector<CELL> *partialGrid = new vector<CELL>();
partialGrid->resize(4);
int partialSize = 4;
MPI_Scatter(gameBoard, partialSize, mpi_cell, partialGrid, partialSize, mpi_cell, 0, MPI_COMM_WORLD);
//do something on each process
cout << "HI!!! I'm scattered process number " << rank << endl;
//ideally, do something to the sub vector here (once it works)
vector<CELL> *rbuf = NULL; //Just make null for all other processes. Valid receive buffer only needed for root (rank = 0)
if (rank == 0)
{
//make sure the receiving buff is created (for just the root rank 0)
vector<CELL> *rbuf = new vector<CELL>();
rbuf->resize(16);
cout << "RANK 0 TEST!" << endl;
}
MPI_Gather(&partialGrid, (pow(n, 2) / p), mpi_cell, &rbuf, (pow(n, 2) / p), mpi_cell, 0, MPI_COMM_WORLD);
目标是(现在是硬编码的)将我们的 16 个元素的向量分成 4 个子向量,一个用于我们的 4 个进程中的每一个来做某事。
我认为我的 0 级逻辑是正确的。我只是MPI_Gather
在 rank 进程上创建一个接收缓冲区,并且在之前为 EACH 进程创建子向量MPI_Scatter
。我尝试了很多东西,但MPI_Scatter
总是失败。请帮忙!
注:CELL
是struct
九个int
值中的一个。mpi_cell
是我在 MPI 程序中创建的自定义类型。为简单起见排除了代码,但如果您想测试,可以CELL
用int
和mpi_cell
替换。MPI_INT
我收到分段错误:
解决方案
正如评论中指出的那样,您new
的 s 是错误的。正确的使用std::vector
方法如下:
std::vector<CELL> gameBoard;
if (rank == 0)
gameBoard.resize(16);
std::vector<CELL> partialGrid;
partialGrid.resize(4);
MPI_Scatter(gameBoard.data(), 4, mpi_cell, partialGrid.data(), 4, mpi_cell, 0, MPI_COMM_WORLD);
// ...
std::vector<CELL> rbuf;
if (rank == 0)
rbuf.resize(16);
MPI_Gather(partialGrid.data(), 4, mpi_cell, rbuf.data(), 4, mpi_cell, 0, MPI_COMM_WORLD);
为简单起见,我也对所有常量进行了硬编码。
推荐阅读
- regex - 如何使用 SPARQL 正则表达式解析 Wikitext 并从 Wikimedia Commons 模板中的参数中提取值?
- flutter - 输入'() => 地图
?不是“地图”类型的子类型 ' 在类型转换中 - javascript - 如何在不离开 Angular 的当前页面的情况下路由到错误页面
- r - R Studio - 无法在 R Markdown 中使用 BASH
- javascript - 允许摄像头时,Webview 中的 MediaDevices.getUserMedia() 权限被拒绝
- rabbitmq - RabbitMQ 滚动升级后保留太多队列镜像
- r - 如何在 R 中绘制河岸而不是单线?
- java - Netty 使用来自池化直接 ByteBuf 的 ByteBuffer
- amazon-web-services - API Gateway 将请求转发到正确的端点
- amazon-web-services - Terraform 为创建的每个 aws_instance 创建 Route53 记录