【发布时间】: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 都没有合适的网格和块大小。”