尝试启动另一个进程,并通过MPIjoin,但访问冲突

我试图启动另一个进程,调用第一个,并通过MPIjoin,但我得到一个访问冲突,我不明白。 我认为代码应该是非常自我解释,访问冲突命中MPI_COMM_ACCEPT行。 我认为一切看起来都是一致的,它应该起作用,但不会。

如果我把这一切都弄错了,还有一个更简单的方法,让我知道。 我没有使用mpiexec,因为我试图在构build整个混乱的testing框架中这样做,但如果这样做更有意义,那么告诉我,我已经做了一个烂摊子。

#include <windows.h> #include <AtlBase.h> #include <atlconv.h> #include <iostream> #include "mpi.h" #include <string> int main(int argc, char** argv) { MPI_Init(&argc, &argv); MPI_Comm intercomm; if (argc == 1) { PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); std::string x = std::string(argv[0]); x += " "; x += std::to_string(1); int res = CreateProcess(NULL, CA2T(x.c_str()), NULL, NULL, false, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &si, &pi); std::cout << res <<std::endl; MPI_Open_port(MPI_INFO_NULL, "A"); MPI_Comm_accept("A", MPI_INFO_NULL, 0, MPI_COMM_SELF,&intercomm); std::cout << MPI_Comm_size(intercomm, &res); std::cout << res; } else { MPI_Comm_connect("A", MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm); } MPI_Finalize(); // } } 

编辑:工作! 这是非常诱人的,但它工作!

 #include <cstdlib> #include <ctime> #include <iomanip> #include <iostream> #include <mpi.h> #include <windows.h> #include <AtlBase.h> #include <atlconv.h> #include <iostream> #include "mpi.h" #include <string> int main(int argc, char** argv) { char myPort[MPI_MAX_PORT_NAME]; MPI_Init(&argc, &argv); MPI_Comm intercomm; if (argc == 1) { PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); MPI_Open_port(MPI_INFO_NULL, myPort); std::string x = std::string(argv[0])+" \""+myPort+"\""; std::cout <<"OLDPROCESS:" << x << std::endl; int res = CreateProcess(NULL, CA2T(x.c_str()), NULL, NULL, false, NORMAL_PRIORITY_CLASS , NULL, NULL, &si, &pi); MPI_Comm_accept(myPort, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm); std::cout << MPI_Comm_size(intercomm, &res); } else { std::cout << "NEWPROCESS:"<<argv[1] << std::endl; strcpy_s(myPort,argv[1]); MPI_Comm_connect(myPort, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm); } MPI_Finalize(); // } } 

您没有正确使用MPI_Open_port 。 你的情况中的第二个参数是字符串文字"A"而函数期望它是一个至少为MPI_MAX_PORT_NAME元素的字符数组。 这是实际端口名称被写入的输出参数。 传递一个常量字符串会导致访问冲突,因为字符串常量通常存储在现代操作系统的只读段中。

此外, MPI_Comm_acceptMPI_Comm_connect的第一个参数应该是由MPI_Open_port返回的端口名称。 由于端口名称可能每次MPI_Publish_name相同,因此MPI允许使用MPI_Publish_name将其注册到众所周知的服务名称MPI_Publish_name 。 然后可以将这个众所周知的名称传递给MPI_Lookup_name以获取端口。 使用一些MPI实现让名称注册正常工作有点棘手,因此对于在同一节点上运行的进程,可以简单地将端口地址写入文件。 在调用CreateProcess之前,你应该明确地做到这一点。