我正在编写一个OpenMP程序来将两个矩阵相乘。这个想法是,每个线程都会计算每个单元格结果的一部分。然后,在那之后,我将每个单元格的结果相加以获得乘法结果。
问题在于,当我使用大型矩阵(512x512或1024x1024)时,该程序会花费很多时间。确实,当我使用具有5个线程的大小为1024x1024的矩阵时,花费了43秒,而具有1个线程时,则花费了14秒。
我在想这可能是导致巨大延迟的关键部分。
代码如下:
(get map key default)
任何帮助将不胜感激。
答案 0 :(得分:0)
此代码存在许多问题。
并行化方法非常效率低:
对于每个可能的i
和j
,您与多个线程共享一个非常小的工作。此外,在并行for循环的末尾有一个隐式屏障。因此,线程之间的通信可能比实际计算花费更多的时间。
关键部分通常很慢(通常使用锁来实现)。在这里,您可以用原子操作代替它。
在使用k个线程的情况下,代码需要多k倍的内存,并且很可能受内存限制(因为缓存和要填充的数据更多,更不用说如今昂贵的其他页面错误)。
因此,您需要重新处理并行化方法。例如,您可以在基于#pragma omp for schedule(static)
的循环上移动i
。另外,您可以将矩阵划分为块,并在线程之间共享工作。
请使用 BLAS 库进行矩阵乘法。它们比此代码优化得多。
以下是一些其他问题的列表:
malloc
,但没有free
)。 TIME
的条件下存在竞争条件。