Matrix 任意精度算法的CUDA实现

Matrix 任意精度算法的CUDA实现,matrix,cuda,matrix-multiplication,arbitrary-precision,Matrix,Cuda,Matrix Multiplication,Arbitrary Precision,我必须乘以两个非常大的(~2000x2000)密集矩阵,它们的条目是任意精度的浮点(我使用的是GMP,精度目前设置为600)。我想知道是否有任何CUDA库支持任意精度的算术?我发现的唯一一个库是CAMPARY,但是它似乎缺少一些对所用函数的引用 我考虑的另一个解决方案是实现一个版本的Karatsuba算法,用于将矩阵与任意精度的条目相乘。该算法的最后一步是将双精度矩阵相乘,这可以使用cuBLAS非常有效地完成。现在已经有类似的实现了吗?因为到目前为止还没有人提出过这样一个库,我们假设没有这样一个

我必须乘以两个非常大的(~2000x2000)密集矩阵,它们的条目是任意精度的浮点(我使用的是GMP,精度目前设置为600)。我想知道是否有任何CUDA库支持任意精度的算术?我发现的唯一一个库是CAMPARY,但是它似乎缺少一些对所用函数的引用


我考虑的另一个解决方案是实现一个版本的Karatsuba算法,用于将矩阵与任意精度的条目相乘。该算法的最后一步是将双精度矩阵相乘,这可以使用cuBLAS非常有效地完成。现在已经有类似的实现了吗?

因为到目前为止还没有人提出过这样一个库,我们假设没有这样一个库

您始终可以实现朴素的实现:

  • 输出矩阵中每对坐标对应一个网格线程
  • 每个线程执行输入矩阵中一行和一列的内积
  • 单个元素操作将使用取自GMP的代码(希望不超过复制和粘贴)
但是你也可以做得更好-就像你可以做得更好的常规浮点矩阵乘法一样。以下是我的想法(当然可能不是最好的):

考虑在中使用共享内存进行矩阵乘法的过程。它建议将小的子矩阵放在共享内存中。您仍然可以这样做-但是您需要小心共享内存大小(它们很小…):

  • 如今,一个典型的GPU每个网格块(或更多)有64 KB的共享内存可用
  • 它们取16×16子矩阵
  • 乘以2(对于两个被乘数)
  • 乘以ceil(801/8)(假设GMP表示使用尾数的600位,符号的1位和指数的200位)
  • 所以512*101<64KB
这意味着您可能只需在他们的工作示例中按原样使用代码,再次使用GMP中的代码替换浮点乘法和加法

您可能想考虑类似于GMP代码本身的并行化,即使用多个线程在600对精度的数字对上协同工作。这可能有助于你的共享记忆阅读模式。或者,您可以在共享内存中交错放置元素表示中的4字节序列,以获得相同的效果


我意识到这有点不对劲,但我很确定我的挥手是正确的,这将是一个“简单的编码问题”。

可能会有兴趣知道cump是否只使用基本的乘法算法?(乍一看似乎是这样)GMP通过提供具有更好的渐进复杂性的算法,如Karatsuba算法和基于FFT的算法,似乎提供了相当大的速度。我认为,考虑到我使用的精度,除非我使用其中一种更有效的算法,否则将计算转移到GPU可能不值得。