涉及多个进程的矩阵乘法中的共享内存

Posted

技术标签:

【中文标题】涉及多个进程的矩阵乘法中的共享内存【英文标题】:Shared memory in matrix multiply involving multiple processes 【发布时间】:2013-03-13 20:56:30 【问题描述】:

我正在尝试通过共享内存学习 IPC。我不明白如何将共享内存分配给不同进程的各种变量。例如,在矩阵乘法中,我不想全局声明矩阵,而是通过共享内存。我们如何将内存附加到不同的矩阵:

谁能帮我解决这个问题?另外,它可以被 mmap() 和 shm_open() 替换还是只是文件?如果是,如何?我找不到恰当的例子来说明进程如何修改共享内存。

【问题讨论】:

*shmem_ptr = value;,也许? 如果您需要使用共享内存,请使用它的现代版本,shm_open 以及mmapmunmap。它使用起来更简单,限制更少。通常,您发布的代码是一团糟,甚至无法编译。在您发帖之前,请清理您的东西。 我只是想传达这个概念......但我不知道它将如何被 shm_open 和 mmap 和 munmap 取代!!! 【参考方案1】:

首先:不要将共享内存用于 IPC。很乱。

在共享内存有意义的大多数情况下,只使用线程更容易也更合适(这样所有内存都是共享的)。如果这不可能,您最好使用某种消息传递方案。

如何从这个共享内存中为矩阵 A 、 B 和结果矩阵分配内存和 附加到它,因为我不必全局声明矩阵,每个进程都需要 A B C 来做 部分问题。

您必须想出一些方法来在共享内存段中分配内存。您不能为此使用 malloc(),因为它的 arena 不包括共享内存。

如果您要存储的唯一数据是这三个矩阵,并且两个进程都知道这些矩阵的大小,您可以将它们全部堆叠成一个结构,然后将其存储在段中:

struct shm_data 
    float A[123][123], B[123][123], C[123][123];
;

struct shm_data *mat = (struct shm_data *) shm;

但是,如果矩阵的大小不固定,则必须在运行时计算它们的地址。

另外,它可以被 mmap() 和 shm_open() 替换还是只是文件?

是的。事实上,mmap() 几乎普遍优于shm_open(),因为内存段由文件支持并遵循文件系统语义,因此可以明智地清理它。 POSIX 共享内存(这是您正在使用的)更奇怪。

【讨论】:

如果我不能在不同的进程中使用全局变量,我在哪里声明包含矩阵、行和列的结构?

以上是关于涉及多个进程的矩阵乘法中的共享内存的主要内容,如果未能解决你的问题,请参考以下文章

从一个进程创建多个共享内存

linux c编程:Posix共享内存区

Linux共享内存

Linux环境编程之共享内存区:共享内存区简单介绍

23共享内存

进程间通信方式——共享内存