我对 MPI 和 OPENMP 有一个实施问题。
我有一个大型的 3D 曲面网格,分为多个元素。我想遍历每个元素(外循环)并计算整个表面(内循环)的积分。总共有两个循环。我希望将此操作并行化。
这种操作发生在边界元方法中。例如,需要这样的操作来求解任意表面上的静电势。第一个循环遍历每个元素中心的每个评估点,第二个循环执行此特定的积分:
其中是拉普拉斯方程的自由空间格林函数,是我们想要在某些给定边界条件下求解的未知势。
MPI:在这里我有两个选择。
我可以在一个处理器中生成网格并将其广播给所有其他处理器。然后我可以在处理器之间分配集成工作。假设我有 N_elm 元素和 n_procs 处理器,然后每个处理器负责集成 (N_elm/n_procs) 元素。(问题)虽然这在进行集成时不需要任何通信,但这是否会在内存中创建 n_procs 个网格副本?
我在一个处理器中生成网格,将其划分为 (N_elm/n_procs) 个元素,以便每个处理器只有域的一部分。每个处理器将能够在其自己的元素上循环并在其网格的一部分上进行本地集成。然而,为了集成网格的各个部分,它不需要通信。因此,我可以为此目的为每个大小为 [(N_elm/n_procs) 个元素 * 3] 的处理器创建一个临时数组。总的来说,每个处理器将创建 2*[(N_elm/n_procs) 个元素 * 3],一个用于自己的网格,另一个用于替换的临时网格。
(问题)是 1 还是 2 更可取,还是有第 3 个选项?
OPENMP:这里的实现更容易。 (问题)当我创建一个网格并并行化 for 循环时会发生什么?线程是给定整个网格的多个副本,类似于上面的数字 (1),还是线程之间共享网格,更像上面的数字 (2)。