【发布时间】:2019-03-29 05:09:03
【问题描述】:
我在我的代码的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 数据类型并可以在所有范围内使用?
【问题讨论】:
-
你可以编写一个函数,返回一个
MPI_Datatype,也就是你的valUnit,然后在需要时调用该函数 -
请注意,
valUnit并不是真正的类型,而是MPI_Datatype类型的值,因此您基本上可以像使用任何其他值一样传递它 -
您可以简单地将
valUnit作为参数传递给send()和recv()。 -
@user463035818 此方法可用,谢谢您的回答。
-
@Evg 这个方法也可以让程序正常运行,谢谢你的回答。