我目前有一个程序,它使用一个单一的过程来加/减/乘/转置一个2D数组(矩阵)。这个程序读取两个文件,将双精度数存储到一个二维数组中,然后执行操作。
现在,我尝试将它从单个进程分离为x个进程。我想尝试让每个父代派生一个子代,每个子代打开矩阵文件,偏移到必要的行/列,执行必要的操作,然后将其返回给父代。
我是进程管理的新手,我知道这不是最有效的方法,但我想知道如何执行它,这是否是解决这个问题的正确方法。
发布于 2013-12-05 04:30:46
要做到这一点,最简单和最直接的方法是使用大多数C/C++和Fortran编译器中提供的OpenMP语言扩展(参见gcc的here )。
并行处理矩阵如下所示:
#pragma omp parallel for
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
// process a[i][j] 然后,外部循环在计算机拥有的CPU数量的线程中自动并行化。
OpenMP扩展提供了许多选项来控制共享内存、工作负载管理等。
发布于 2013-12-05 01:58:24
这基本上是正确的。您可能希望将矩阵放在共享内存中(否则每个子节点将处理自己的副本),然后派生您的子节点。如果您绝对确定每个子级将只对矩阵中自己的部分进行操作,则可以放弃同步。所以就像这样
create/attach share memory
read matrix into shm
for(0..x)
{
fork();
if (child)
doCalcs(some matrix subset);
}
for(0..x)
wait(); 这是不是比它的价值更多,这可能是只有你尝试后才能回答的问题。另一个明显的选择是线程,但也不一定会降低复杂性。
https://stackoverflow.com/questions/20381731
复制相似问题