我想计算一下带宽 矩阵向量乘法和加法:(假设A = M乘N大) y = A * x + b
但是我对从全局内存中读取的字节数的读写次数感到困惑:
是有效的带宽:
bytesReadWrite = M*N (for reading A) + N(for read x) + M (for read b) + M(for write y)
或者是
bytesReadWrite = M*N (for reading A) + M*N (for read x) + M (for read b) + M(for write y)
M * N代表x,因为我们基本上读取了每行的整个x(同样,如果我们使用共享内存,我们最终会读取每行的整个x向量)
有人对什么是正确的选择有一些好的建议吗?我真的不明白......
我倾向于使用第一次计算,但为什么呢?它有意义吗?
非常感谢!!!
答案 0 :(得分:1)
几乎可以肯定没有上述内容。在内存带宽方面,现代处理器将所有要操作的项目加载到二级缓存中,然后从那里对它们进行操作,之后结果将被写回到内存中以便更改任何项目。实际上,您的带宽只是所涉及的所有元素的总大小。注意:即使这是过于简单化,因为它没有考虑流媒体的影响,更不用说内存分页了。对于流式传输,单个矩阵对大量数据进行操作(例如,3D图形计算)并不罕见;在这种情况下,矩阵被加载到L2高速缓存(并且可能是为了合理优化的代码从那里进入寄存器)一次,然后向量加载通过。再一次,如果不了解现代的内存分页技术,模型就不会完全完整;例如,如果矩阵和向量存储在不同的存储页面中,则上面存在巨大的差异;更不用说将数据包装在一起以便“流式传输”到L2缓存中的严重优化。即便如此,这也是假设执行矩阵数学的CPU模型;将GPU带入图片会再次极大地改变现状。