在共享内存中的GPU上查找小型非对称矩阵本征对的最快方法


9

我有一个问题,我需要找到一个小的(通常小于60x60)非对称矩阵的所有正对(如特征值为正)。当特征值小于某个阈值时,我可以停止计算。我知道特征值是真实的。关于可以用来尝试获得最佳性能的算法有何建议?我必须进行数千次分解,因此速度很重要。

先感谢您。

编辑:我需要在共享内存的GPU上执行此操作。矩阵也不必相同大小。我目前不知道有任何图书馆可以这样做。将会提出非常适合该问题的算法建议。


1
如果我做对了,您将拥有一个CUDA内核,可以在共享内存中计算数千个小型矩阵,并且您不愿意将它们复制到全局内存中。在尝试给出答案之前,需要澄清一些要点。在CUDA中,共享内存的生命周期必然会影响块的生命周期:每个矩阵要分解多少个线程?出色的表现真的很重要吗?(期望的特征值提取时间与矩阵生成时间相比如何?)基于什么论点,您知道本征系统是真实的?本征系统会出现缺陷吗?
Stefano M

您好Stefano,谢谢您的评论。现在,我将具有最接近要分解的矩阵尺寸的扭曲大小的倍数。矩阵生成时间相差很大,并且在某些情况下矩阵生成时间更昂贵,但是在许多情况下,矩阵生成时间少于分解时间。我知道特征值是真实的,因为矩阵的生成方式。我不想在这里进行详细说明,因为这会损害原始问题。最后,是的,系统可能有故障。
Kantoku 2012年

Answers:


3

建议您无需过多搜索即可查看MAGMA库。具有持续支持的免费代码。NVIDIA 认为 MAGMA是“本征值问题求解器的突破”。

还有CULA库,它通常是商业产品,尽管最近它已免费提供给学术界使用(请参阅此处的详细信息)。


谢谢您的答复亚历山大。我之前研究过这两个库,据我所知,这些函数是从主机调用的,并且内存需要位于全局内存中。我相信开销太大,无法证明使用合理。所有这些矩阵都在共享内存中生成,在内核中使用然后丢弃。我想将它们保留在那里而不必将它们放回全局内存中。即使我确实将它们推送到那里,仍然存在从主机调用许多内核函数的问题(尽管存在多个流)。
KANTOKU

1
@Kantoku,是的,这些库更通用,它们将整个矩阵存储在全局内存中。如果您的矩阵在共享内存中,则只有一个SM可以在它们上工作,不是吗?因此,EVD的实现应该非常简单。
亚历山大

是的,我会这样想,这就是为什么我一直在寻找适合这种情况的算法的原因。我对非对称evd不太熟悉,所以我在寻找建议。
KANTOKU

@Kantoku(和亚历山大)。即使在顺序情况下,非对称EVD也不是很简单。它仍然是一个活跃的研究领域。
2012年

@JackPoulson嗯,是的,但是我(我也假设亚历山大)是说,考虑到当我们考虑尺寸和性质时可以进行许多简化,可以简单地将已建立的算法应用于该问题。矩阵的考虑。问题是:哪种算法。
Kantoku

2

使用LAPACK中的功能,您不太可能在自己的实现中击败它们。


嗨,沃尔夫冈。感谢您的回答,但我打算在使用CUDA的GPU中以及数千个微小矩阵(每个块处理单个矩阵的分解)中实现这一点,并且矩阵的大小不一定相同,因此实现我自己使用共享内存的某些东西似乎是我唯一的选择。知道哪种算法最适合这些类型的矩阵吗?PS:感谢您的交易。上学期您在KAUST上进行了II讲授。我很喜欢:)
Kantoku

2
@Kantoku您应该在问题中添加这些详细信息,否则会引起误解。
亚历山大

@亚历山大我已经更新了更多细节。谢谢你的建议!
KANTOKU

1
@Kantoku:GPU超出了我的领域,但我确定那里已经有可以满足您需求的库(事实上,我看到其他答案已经链接到它们了)。很高兴听到您喜欢我的课程!
Wolfgang Bangerth,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.