c++ - 如何在 mpi 中创建新的数据类型并在所有范围内生效?
问题描述
我在我的代码的main函数中定义了一个新的MPI数据类型,但是好像不能在其他函数中使用。
typedef struct {
int row;
int col;
double val;
} unit;
void sendTest() {
unit val;
val.row = val.col = val.val = 1;
MPI_Send(&val, 1, valUnit, 1, 0, MPI_COMM_WORLD);
}
void recvTest() {
unit val;
MPI_Recv(&val, 1, valUnit, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
int main(int argc, char* argv[]) {
int comm_sz,my_rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
int blockcount[3]={1,1,1};
MPI_Aint offsets[3] = {offsetof(unit, row), offsetof(unit, col), offsetof(unit, val)};
MPI_Datatype dataType[3] = {MPI_INT, MPI_INT, MPI_DOUBLE};
MPI_Datatype valUnit;
MPI_Type_create_struct(3, blockcount, offsets, dataType, &valUnit);
MPI_Type_commit(&valUnit);
if(my_rank == 0)
sendTest();
else
recvTest();
MPI_Finalize();
return 0;
}
当我编译程序时,我得到一个错误:
error: ‘valUnit’ was not declared in this scope
我想知道如何一次定义新的 mpi 数据类型并且可以在所有范围内使用?
解决方案
只需声明valUnit
为全局变量(例如,在typedef ...
声明之后)。
注意send()
和recv()
的函数,glibc
因此您应该在程序中重命名这些子例程,否则您可能会遇到一些非常奇怪的副作用。
推荐阅读
- spring-boot - spring-boot application.properties 未被覆盖
- python - scipy.optimize 可以最小化复杂变量的函数吗?如何最小化?
- javascript - ng-options 使用 AngularJS V1.5 隐藏空白值
- java - 复制到类文件中的 IBM Java V9 静态字段引用
- css - 背景附件:固定;不能在 Firefox 中工作
- c - 没有初始化、条件、增量的循环
- openid-connect - 将自定义 OpenID Connect 声明映射到联系人属性
- pgadmin - pgAdmin 4 如何查看当前的还原作业?
- ios - 卸载应用时动态链接firebase没有打开应用商店
- python - 如何使用 Python 对以数字文件名作为键的 JSON 文件名进行排序?