gpt4 book ai didi

matrix - 任意精度算术的 CUDA 实现

转载 作者:行者123 更新时间:2023-12-03 20:19:38 27 4
gpt4 key购买 nike

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

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

最佳答案

由于到目前为止没有人提出过这样的库,让我们假设一个不存在。
你总是可以实现简单的实现:

  • 输出矩阵中每对坐标的一个网格线程。
  • 每个线程执行输入矩阵中行和列的内积。
  • 单个元素操作将使用从 GMP 中获取的代码(希望不会超过复制和粘贴)。

  • 但是您也可以做得比这更好 - 就像您可以为常规浮点矩阵乘法做得更好一样。这是我的想法(当然可能不是最好的):
    考虑 worked example CUDA C Programming Guide中使用共享内存的矩阵乘法.它建议将小的子矩阵放在共享内存中。您仍然可以这样做 - 但您需要小心共享内存大小(它们很小......):
  • 今天典型的 GPU 每个网格块有 64 KB 可用共享内存(或更多)
  • 它们采用 16 x 16 子矩阵。
  • 乘以 2(对于两个被乘数)
  • 时间 ceil(801/8)(假设 GMP 表示使用尾数的 600 位,符号的一位和指数的 200 位)
  • 所以 512 * 101 < 64 KB!

  • 这意味着您可能可以按原样使用他们工作示例中的代码,再次用来自 GMP 的代码替换浮点乘法和加法。
    然后,您可能需要考虑并行化 GMP 代码本身,即使用多个线程在单对 600 位精度数字上协同工作。这可能有助于您的共享内存读取模式。或者,您可以在共享内存中从元素的表示中交错放置 4 字节序列,以获得相同的效果。
    我意识到这有点手动,但我很确定我已经正确地挥了挥手,这将是一个“简单的编码问题”。

    关于matrix - 任意精度算术的 CUDA 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36895629/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com