【问题标题】:How to create a new datatype in mpi and take effect in all scope?如何在 mpi 中创建新的数据类型并在所有范围内生效?
【发布时间】: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 这个方法也可以让程序正常运行,谢谢你的回答。

标签: c++ mpi


【解决方案1】:

只需将valUnit 声明为全局变量(例如,在typedef ... 声明之后)。

注意send()recv() 是来自glibc 的函数,因此您应该在程序中重命名这些子例程,否则您可能会遇到一些非常奇怪的副作用。

【讨论】:

  • 你说得对,我重新编辑了这个问题。并且你的方法是可用的。
猜你喜欢
  • 2017-05-27
  • 2013-12-01
  • 2013-12-02
  • 2011-11-10
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多