【问题标题】:Construct a pointer in C from an address从地址构造 C 中的指针
【发布时间】:2013-03-07 18:42:53
【问题描述】:

我最初从另一个处理器获得一个指针的地址,我需要一个指向该地址项的指针。不要太担心 MPI_Recv,只要知道我正在从另一个处理器获取信息。所以我有:

MPI_Recv(&a, sizeof(int), MPI_INT, 0, 1, MPI_COMM_WORLD, &status);  

c = a;
printf("%d",c[0]);

为什么这会给我一个分段错误?在设置 c = a 之前,我也尝试为 c 分配内存,它仍然会出现段错误。

【问题讨论】:

  • 先搜索虚拟内存地址
  • 另一个非常相关的细节:哪个操作系统?
  • 操作系统:Linux。这是一个并行应用程序,我相信应该是处理器
  • @hyde 如果我在集群上运行我的应用程序,我会假设每个节点都有自己的处理器。然而,每个节点可能有几个进程。我认为这是正确的区别,但如果我错了,请纠正我。
  • @thepristinedesign 啊集群,mpi 标签现在添加了,甚至。 处理器可能是正确的术语,也可能不是正确的术语,我还不够熟悉,无法以一种或另一种方式说出来......删除上面的我的cmets。

标签: c pointers mpi


【解决方案1】:

每个进程都有自己独立的virtual address spaces。一个进程的指针在另一个进程的上下文中是没有意义的。

您有多种选择:

  1. 使用threads 代替进程。
  2. 使用shared memory。
  3. 发送实际数据而不仅仅是指针。

如果您的进程可以驻留在不同的计算机上,则只有最后一个选项是可行的。

【讨论】:

  • 对于共享内存,仍然需要提供相对地址而不是直接指针,因为共享内存段可能在每个进程中映射到不同的虚拟地址。
  • 这个答案是正确的,但是它错过了MPI共享内存。
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 2021-12-24
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多