MPI_Irecv函数中source参数出现负值的问题求助
首先明确:MPI标准规定,MPI_Irecv的source参数合法取值只能是0到进程总数-1,或是代表任意来源的MPI_ANY_SOURCE(标准定义值为-1),你遇到的-2属于非法值,结合打印的tag=1073741795(非标准的MPI_ANY_TAG,通常为-1),大概率是代码层面的问题,以下是排查方向:
变量未初始化直接传入
检查调用MPI_Irecv前,source和tag变量是否被正确赋值。如果这些变量未初始化,栈上的随机垃圾值就会被当作参数传入,出现-2这类异常值。确保要么给source指定具体进程号,要么设为MPI_ANY_SOURCE,tag同理。内存越界覆盖参数变量
排查MPI_Irecv调用附近的代码,有没有数组越界、野指针操作等情况。如果source变量的内存地址和其他变量/缓冲区相邻,错误的内存操作可能会覆盖它的值,导致传入非法参数。MPI_Irecv参数顺序传错
核对MPI_Irecv的参数顺序是否符合标准原型:int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request);如果误把
tag和source、或者request和其他参数的位置搞混,就会导致非法值被传入。你打印的tag值明显是异常的垃圾值,参数顺序错误的可能性很高。编译器优化导致的变量异常
若开启了较高等级的编译器优化(如-O2、-O3),编译器可能会对未被正确使用的变量做优化,导致打印的值和实际传入的不一致。可以尝试用-O0关闭优化后重新编译运行,验证问题是否消失。
验证建议:
在调用MPI_Irecv前,手动给source和tag赋值为合法值(比如source=0,tag=100),打印这两个变量的值;调用MPI_Irecv后再次打印传入的参数值,对比前后是否一致。如果前值正确但传入后值异常,基本可以确定是内存被改写或参数传错。
内容的提问来源于stack exchange,提问作者Mariem

