尝试启动另一个进程并通过 MPI 加入它,但获得访问冲突
Trying to start another process and join it via MPI but getting access violation
我正在尝试启动另一个调用第一个进程并通过 MPI 加入它的进程,但我遇到了无法弄清楚的访问冲突。我认为代码应该是不言自明的,访问冲突在MPI_COMM_ACCEPT行命中。我认为一切看起来或多或少都符合要求,它应该有效,但它不会。
如果我做错了,并且有一种更简单的方法,请告诉我。我没有使用 mpiexec,因为我试图在构建整个混乱的测试框架中执行此操作,但如果这更有意义,那么告诉我我已经搞砸了。
#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_accept
和 MPI_Comm_connect
的第一个参数应该是 MPI_Open_port
返回的端口名。由于端口名称可能每次都不同,因此 MPI 允许使用 MPI_Publish_name
以众所周知的服务名称注册端口名称。然后,可以将该已知名称传递给MPI_Lookup_name
以获取端口。对于某些 MPI 实现,让名称注册正常工作有点棘手,因此对于在同一节点上运行的进程,可以简单地将端口地址写入文件。显然,您应该在致电CreateProcess
之前执行此操作。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 尝试启动另一个进程并通过 MPI 加入它,但获得访问冲突