gpt4 book ai didi

cuda - cuda中的矩阵乘法

转载 作者:行者123 更新时间:2023-12-03 06:20:37 28 4
gpt4 key购买 nike

假设我想将两个矩阵相乘,50 x 50。我有两种方法来排列线程和 block 。

a) 一个线程计算结果矩阵的每个元素。所以我在线程中有一个循环将一行和一列相乘。

b) 一个线程执行每个乘法。结果矩阵的每个元素需要 50 个线程。乘法完成后,我可以使用二进制归约来对结果求和。

我不确定该走哪条路,所以我选择了b。这并不理想。事实上它很慢。知道为什么吗?我的猜测是线程太多,并且它们大部分时间都在等待资源,这是真的吗?

最佳答案

与高性能计算中的许多事情一样,理解性能的关键是理解内存的使用。

如果您使用一个线程执行一次乘法,那么对于该线程,您必须从内存中提取两条数据,将它们相乘,然后进行一些对数加法。这是乘法、加法和位的三次内存访问 - 算术强度非常低。好消息是,这样有很多线程值得任务,每个线程只需要一点点内存/寄存器,这对占用有好处;但内存访问工作率较差。

简单的一个线程执行一个点积方法也存在同样的问题 - 每个乘法需要两次内存访问来加载。好消息是,整个点积只有一个存储到全局内存,并且您可以避免二进制归约,这种归约不能很好地扩展并且需要大量同步;缺点是现在线程少了很多,至少你的 (b) 方法对你有用。

现在您知道应该有某种方法可以在每次内存访问时执行比这更多的操作;对于 NxN 方阵,需要 N^3 工作来进行乘法,但只有 3xN^2 个元素 - 因此您应该能够找到一种方法,每 2 次内存访问执行超过 1 次计算。

CUDA SDK 中采用的方法是最好的方法 - 将矩阵分解为图 block ,并使用您的 (b) 方法 - 每个输出元素一个线程。但关键在于线程如何排列。通过将整个小子矩阵从慢速全局内存拉入共享内存,并从那里进行计算,可以对从内存中读取的每个数字进行多次乘法和加法。这种方法是许多应用中最成功的方法,因为获取数据(无论是通过网络、CPU 主内存还是 GPU 的片外访问)通常比处理数据需要更长的时间。

NVidia 的 CUDA 页面(特别是 http://developer.nvidia.com/object/cuda_training.html )中有文档很好地描述了他们的 SDK 示例。

关于cuda - cuda中的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3860531/

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