OpenMP矩阵乘法比预期花费更多的时间

时间:2020-05-23 19:34:35

标签: c openmp

我正在编写一个OpenMP程序来将两个矩阵相乘。这个想法是,每个线程都会计算每个单元格结果的一部分。然后,在那之后,我将每个单元格的结果相加以获得乘法结果。

问题在于,当我使用大型矩阵(512x512或1024x1024)时,该程序会花费很多时间。确实,当我使用具有5个线程的大小为1024x1024的矩阵时,花费了43秒,而具有1个线程时,则花费了14秒。

我在想这可能是导致巨大延迟的关键部分。

代码如下:

(get map key default)

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

此代码存在许多问题。

并行化方法非常效率低

对于每个可能的ij,您与多个线程共享一个非常小的工作。此外,在并行for循环的末尾有一个隐式屏障。因此,线程之间的通信可能比实际计算花费更多的时间。

关键部分通常很慢(通常使用锁来实现)。在这里,您可以用原子操作代替它。

在使用k个线程的情况下,代码需要多k倍的内存,并且很可能受内存限制(因为缓存和要填充的数据更多,更不用说如今昂贵的其他页面错误)。

因此,您需要重新处理并行化方法。例如,您可以在基于#pragma omp for schedule(static)的循环上移动i。另外,您可以将矩阵划分为,并在线程之间共享工作。

请使用 BLAS 库进行矩阵乘法。它们比此代码优化得多。

以下是一些其他问题的列表:

  • 存在内存泄漏(存在malloc,但没有free)。
  • 在基于TIME的条件下存在竞争条件。
  • 与平面阵列相比,锯齿状阵列可能效率不高。
相关问题