gpt4 book ai didi

c++ - 自动类型的 MPI 广播变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:14 29 4
gpt4 key购买 nike

我正在研究生成 C++ 代码的编译器。在以下情况下:

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank == 0){
auto i = function();
// do something
MPI_Bcast(&i, 1, MPI_INT, 0, MPI_COMM_WORLD);
}
else{
auto i;
MPI_Bcast(&i, 1, MPI_INT, 0, MPI_COMM_WORLD);
cout << i;
}

变量“i”的类型在编译时确定,MPI 是否具有允许广播此类变量的通用类型?如果没有,我该如何广播这些变量?而且,我应该如何接收这些变量,因为不允许简单地声明 auto i;

最佳答案

您可以使用模板返回您需要的信息:

#include <mpi.h>
#include <iostream>

int function() {
int r;
MPI_Comm_rank(MPI_COMM_WORLD, &r);
return r;
}

struct typecount {
MPI_Datatype mpitype;
int count;
};

template<typename T> typecount gettypecount(T t) { typecount tc={ MPI_BYTE, sizeof(T) }; return tc; };
template<> typecount gettypecount(int t) { typecount tc={ MPI_INT, 1 }; return tc; };
template<> typecount gettypecount(double t) { typecount tc={ MPI_DOUBLE, 1 }; return tc; };
template<> typecount gettypecount(char t) { typecount tc={ MPI_CHAR, 1 }; return tc; };

int main(int argc, char **argv) {
int rank;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0){
auto i = function();
const typecount tmap = gettypecount(i);
MPI_Bcast(&i, tmap.count, tmap.mpitype, 0, MPI_COMM_WORLD);
}
else{
decltype(function()) i = 0;
const typecount tmap = gettypecount(i);
MPI_Bcast(&i, tmap.count, tmap.mpitype, 0, MPI_COMM_WORLD);
std::cout << i << std::endl;
}

MPI_Finalize();
return 0;
}

运行给出:

$ mpicxx -o typetest typetest.cxx  --std=c++11 -Wc++11-extensions -Wall
$ mpirun -np 4 ./typetest
0
0
0

关于c++ - 自动类型的 MPI 广播变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35868050/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com