MPI_Send()的tag可以是long int吗?
Can the tag of MPI_Send() be a long int?
我正在处理使用 cpp
和 openmpi
的项目。在我的程序中,有很多"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 int
s。 C 绑定将标记定义为 int
,但实际允许的值集甚至更小,并且还依赖于实现。其一,标签必须是正面的。然后是 MPI 实现强加的上限 (UB),可通过查询 MPI_COMM_WORLD
的 MPI_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 成为实际消息数据的一部分。
我正在处理使用 cpp
和 openmpi
的项目。在我的程序中,有很多"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 int
s。 C 绑定将标记定义为 int
,但实际允许的值集甚至更小,并且还依赖于实现。其一,标签必须是正面的。然后是 MPI 实现强加的上限 (UB),可通过查询 MPI_COMM_WORLD
的 MPI_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 成为实际消息数据的一部分。