c - MPI_send 和 MPI_recv 多次
问题描述
我正在尝试使用点对点例程(MPI_send 和 MPI_recv)实现一个简单版本的 MPI_reduce。我只想模拟[0,1,2]
使用 SUM 操作将数组减少到根。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
void my_reduce(void* send_data,void* recv_data,int count, MPI_Datatype datatype,MPI_Op op,int root,MPI_Comm communicator){
int world_rank;
MPI_Comm_rank(communicator, &world_rank);
int world_size;
MPI_Comm_size(communicator, &world_size);
int tmp=*((int*)recv_data);
printf("current recv_data is %d\n",*(int*)recv_data);
if(world_rank==root){
MPI_Recv(recv_data,count,datatype,root,0,communicator,MPI_STATUS_IGNORE);
tmp+=*((int*)recv_data);
*((int*)recv_data)=tmp;
printf("the value after reduce is now is %d\n",*((int*)recv_data));
}else{
MPI_Send(send_data,count,datatype,root,0,communicator);
printf("now sending %d to root\n",*((int*)send_data));
}
}
int main(int argc, char** argv) {
MPI_Init(NULL, NULL);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int data[3]={0,1,2};
int dest;
dest=0;
if(world_rank==1){
my_reduce(&data[1],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
}
if(world_rank==0){
my_reduce(&data[0],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
}
if(world_rank==2){
my_reduce(&data[2],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
}
if(world_rank==0){
my_reduce(&data[0],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
}
MPI_Finalize();
printf("value of destination after reduce is %d\n",(dest));
return 0;
}
我对如何从发送接收多个时间感到困惑。在此示例中,root 从第二个和第三个进程接收 2 次。我的代码给出了错误的输出:
current recv_data is 0
now sending 1 to root
current recv_data is 0
current recv_data is 0
now sending 2 to root
如果我在一个分支中添加两个 MPI_recv,即:
if(world_rank==0){
my_reduce(&data[0],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
my_reduce(&data[0],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
}
它仍然是错误的。你能就如何纠正这个问题提供一些建议吗?
解决方案
推荐阅读
- junit5 - 是否可以在同一个测试文件中混合 jqwik @Property 方法和 junit5 @Test 方法?
- passwords - 此处未经授权映射空白方块
- ruby - 找不到 Gem IO-Console
- sqlalchemy - SQLAlchemy 抛出完整性错误,“更新或删除表违反外键约束”
- python - excel宏的完整文件路径
- php - php codeigniter网站显示未连接到safari ios手机中的服务器
- c++ - C++ 中的字符串是否没有超出范围的异常/错误?
- python - 正则表达式:直到但不包括组或组
- excel - VBA display XML with hierarchy in cells
- excel - VBA SUB 没有对象集