Matrix 任意精度算法的CUDA实现
我必须乘以两个非常大的(~2000x2000)密集矩阵,它们的条目是任意精度的浮点(我使用的是GMP,精度目前设置为600)。我想知道是否有任何CUDA库支持任意精度的算术?我发现的唯一一个库是CAMPARY,但是它似乎缺少一些对所用函数的引用Matrix 任意精度算法的CUDA实现,matrix,cuda,matrix-multiplication,arbitrary-precision,Matrix,Cuda,Matrix Multiplication,Arbitrary Precision,我必须乘以两个非常大的(~2000x2000)密集矩阵,它们的条目是任意精度的浮点(我使用的是GMP,精度目前设置为600)。我想知道是否有任何CUDA库支持任意精度的算术?我发现的唯一一个库是CAMPARY,但是它似乎缺少一些对所用函数的引用 我考虑的另一个解决方案是实现一个版本的Karatsuba算法,用于将矩阵与任意精度的条目相乘。该算法的最后一步是将双精度矩阵相乘,这可以使用cuBLAS非常有效地完成。现在已经有类似的实现了吗?因为到目前为止还没有人提出过这样一个库,我们假设没有这样一个
我考虑的另一个解决方案是实现一个版本的Karatsuba算法,用于将矩阵与任意精度的条目相乘。该算法的最后一步是将双精度矩阵相乘,这可以使用cuBLAS非常有效地完成。现在已经有类似的实现了吗?因为到目前为止还没有人提出过这样一个库,我们假设没有这样一个库 您始终可以实现朴素的实现:
- 输出矩阵中每对坐标对应一个网格线程
- 每个线程执行输入矩阵中一行和一列的内积
- 单个元素操作将使用取自GMP的代码(希望不超过复制和粘贴)
- 如今,一个典型的GPU每个网格块(或更多)有64 KB的共享内存可用
- 它们取16×16子矩阵
- 乘以2(对于两个被乘数)
- 乘以ceil(801/8)(假设GMP表示使用尾数的600位,符号的1位和指数的200位)
- 所以512*101<64KB李>
您可能想考虑类似于GMP代码本身的并行化,即使用多个线程在600对精度的数字对上协同工作。这可能有助于你的共享记忆阅读模式。或者,您可以在共享内存中交错放置元素表示中的4字节序列,以获得相同的效果
我意识到这有点不对劲,但我很确定我的挥手是正确的,这将是一个“简单的编码问题”。可能会有兴趣知道cump是否只使用基本的乘法算法?(乍一看似乎是这样)GMP通过提供具有更好的渐进复杂性的算法,如Karatsuba算法和基于FFT的算法,似乎提供了相当大的速度。我认为,考虑到我使用的精度,除非我使用其中一种更有效的算法,否则将计算转移到GPU可能不值得。