【问题标题】:Calculating (very) large matrix products with CUDA使用 CUDA 计算(非常)大的矩阵乘积
【发布时间】:2015-04-12 10:02:20
【问题描述】:

我刚刚开始学习一些cuda 编程,我对如何处理超过块/线程大小的大型矩阵的计算很感兴趣。

例如,我有seen code,它显示了如何执行平铺矩阵乘法,但由于块大小和网格大小太小而失败。在上述代码中,如果 Block size 和 Grid size 都设置为1,那么只会计算最终矩阵的第一个元素。

答案很简单:调用具有更大块和网格大小的内核,但是当我想执行一个包含 800 万行和 600 万列的矩阵乘法时会发生什么 - 任意大的东西,没有合适的 Grid 和任何现代 GPU 的块大小?

我在哪里可以找到示例代码或如何处理这类事情的算法?我相信简单的情况应该是一个矩阵乘法算法,如果用<<<1,1>>> 调用它就可以工作,任何可以解释这个调用的算法都应该能够解释任何更大的矩阵。

【问题讨论】:

  • 一个 600 万乘 800 万个元素的密集浮点矩阵大约需要192 TB 的存储空间(两倍是两倍。)如果每个元素分配一个线程,则“仅”需要大约 10 TB 的存储空间。 48 万亿个线程——约 35 位寻址。 cc3.0+ 设备上的 CUDA 网格暗淡提供(理论上)~63 位 block 地址空间,更不用说每个块有 1024 个线程的可用性(因此超过 70 位的可寻址线程空间。)这个问题似乎是基于错误的前提:“任意大的东西,对于任何现代 GPU 都没有合适的网格和块大小。”

标签: c++ matrix cuda


【解决方案1】:

非常大的矩阵的主要问题不是块数或线程数。主要问题是您无法将整个矩阵放入 GPU 的 DRAM 内存中。因此,为了进行乘法运算,您需要手动使用平铺将输入矩阵划分为可以放入 GPU 内存的平铺。然后,您需要在 GPU 上使用尽可能多的线程在该图块上运行矩阵乘法,然后将图块结果返回给主机 (CPU)。

当您在 GPU 上处理这些大图块时,您需要启动 1000 多个线程才能获得所需的性能。只启动一个线程对您没有任何帮助。

有关更多信息,您可以查看这篇论文:

基于CUDA的超大矩阵计算快速实现

我刚刚通过谷歌搜索“大型矩阵乘法 CUDA”找到它

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2014-09-13
    • 2011-05-02
    相关资源
    最近更新 更多