GPU上小矩阵的局部求逆?

计算科学 有限元 显卡 不连续-galerkin
2021-12-03 20:25:55

目前我对GPU计算不太了解,所以请原谅这个简单的问题。可以在 GPU 上并行反转局部矩阵吗?CUBLAS 似乎不支持因式分解,而且我为 GPU 找到的大多数 LU/QR/Chol 库旨在加速单个直接因式分解。

例如,如果必须为显式 DG 方法重新计算质量矩阵,是否有办法在 GPU 上本地重新反转它们(即以更多的 MPI 方式,在多个扭曲/块/等上并行计算分解)?

编辑:我正在尝试查看是否可以在 GPU 上组装和反转大量小矩阵。

2个回答

对您的问题的简短回答是肯定的,您可以在 GPU 上反转大量小型独立矩阵,并且很可能您可以有效地做到这一点。然而,最好的解决方法并不是这样一个直截了当的答案。我可以想到三种可能的实现,尽管我从一开始就承认我从未尝试过这些,所以我可能会忽略其中任何一个的问题。

  1. 最简单的方法是将所有矩阵组装成 gpu 上的一个更大的块对角矩阵,然后对整个事物使用单个矩阵求解。这将保留块对角线形式,并且只需要将每个块作为其各自矩阵的逆矩阵拉出。您需要将块大小和线程数调整为较小的矩阵大小,如果它们的大小不同,那将变得相当困难。这是您可能有机会实现库的唯一选项。
  2. 创建一个更高级别的 GPU 内核,该内核采用指针向量和矩阵大小,并为每个矩阵调用一个较小的内核。这将是一个更易于理解的程序,但是将线程/块分配给较小的矩阵会更加复杂,因为块和线程 id 是在高级内核中分配的,而不是在低级内核中分配的。
  3. 创建一个低级内核来求解单个矩阵,并从 CPU 依次调用它们。这可能是最好的方法,但是在让 CPU 继续进入程序之前,您需要进行检查以确保所有内核都是完整的。

请注意,所有这些方法也可用于在 GPU 内存中构造矩阵的内核,而不仅仅是求解它们。

ViennaCL 有多个前端(OpenMP/OpenCL/CUDA)并且易于使用。它可以执行 QR 分解,但是我不知道它是否适合您,因为它只执行;是 CUDA 设备上分解的一部分。但在我看来,它仍然是最友好的库之一。:

手册- 第 32 页

万维网