MPI_Send()的tag可以是long int吗?

Can the tag of MPI_Send() be a long int?

我正在处理使用 cppopenmpi 的项目。在我的程序中,有很多"compute units",我称它们为元素。对于每个元素,我生成一个唯一的 unsigned long int 来标识它,我称这个整数为 key

问题是我现在需要一些元素在处理器之间相互通信,即使用 MPI_Send()MPI_Recv()。由于每个元素都知道它应该向谁发送消息和从谁接收消息,即它知道它们应该发送或接收的目标元素的键,所以使用键作为 tag 会很直观MPI_Send()MPI_Recv()。但是,我在 man page 中看到了 tag openmpi 的是 int。所以它是一个 4 字节的整数?我可以使用 unsigned long int 作为标签吗?非常感谢!

不,不幸的是,标签不能是 long ints。 C 绑定将标记定义为 int,但实际允许的值集甚至更小,并且还依赖于实现。其一,标签必须是正面的。然后是 MPI 实现强加的上限 (UB),可通过查询 MPI_COMM_WORLDMPI_TAG_UB 属性获得:

int flag;
int *tag_ub;

MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &tag_ub, &flag);
if (flag)
  cout << "Max allowed tag value is " << *tag_ub << endl;
else
  cout << "No idea what the max allowed tag value is" << endl;

不仅不同 MPI 实现之间的值可能不同,而且基于作业选择的通信传输的相同实现,它也可能不同(我已经看到某些 MPI 实现会发生这种情况) .标准只保证你标签UB的值不会小于32767.

最好和最便携的选择是使元素 ID 成为实际消息数据的一部分。