我正在使用将生成进程的主机(MPI_Comm Spawn)配置我的 MPI_Info。
问题是当我使用大量进程时,设置没有正确执行,抛出这个错误:
Fatal error in MPI_Info_set: Invalid MPI_Info value , error stack:
MPI_Info_set(117): MPI_Info_set(info=0x9c000000, key=hosts, value=cuda00,cuda00,cuda00,cuda00,cuda00,cuda00,cuda00,cuda00,cuda01,cuda01,cuda01,cuda01,cuda01,cuda01,cuda01,cuda01,cuda02,cuda02,cuda02,cuda02,cuda02,cuda02,cuda02,cuda02,cuda03,cuda03,cuda03,cuda03,cuda04,cuda0
MPI_Info_set(97).: Value is too long
“值”字段是主机列表,这个主机列表被分配给 MPI_Info 结构:
MPI_Info_set(info, "hosts", mpihosts);
其中“mpihosts”是一个char*。
我可以更改MPI_Info的容量吗?
最佳答案
确实,在 MPI_INFO
中描述值的字符串有一个硬编码的最大长度。它在 mpi.h
中定义,并且它被命名为 MPI_MAX_INFO_VAL
。根据MPI standards , 在第 9 章 (p397) 的开头:
values have an implementation-defined maximum length of
MPI_MAX_INFO_VAL
... ... If either key or value are larger than the allowed maximums, the errors MPI_ERR_INFO_KEY or MPI_ERR_INFO_VALUE are raised, respectively.
让我们打印这个值:通过尝试 printf("MPI_MAX_INFO_VAL is %d\n",MPI_MAX_INFO_VAL);
,我的 openmpi 值为 256...有一行 #define MPI_MAX_INFO_VAL MPICH2的文件mpich3-2/src/include/mpi.h.in中的1024
。因此,主机名列表可能太长而无法作为键值存储在 MPI_INFO 结构中。
作为替代方案,主机列表可以存储在文件中,文件名可以作为键 的值提供给
,详见 documentation of OpenMPI MPI_Comm_spawn()
MPI_INFO 结构的 hostfile
关于c - 设置 MPI_Info : value is too long 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41717628/