【发布时间】:2021-09-15 19:20:40
【问题描述】:
我最近参加了一次工作面试,要求我将 2 个矩阵相乘,这真的很容易。然后有人问我:
想象一下,当读取任何矩阵的一个值时,CPU 会从右边得到 4 个相邻的值,你如何利用这个事实来提高性能?
起初我虽然将每 4 个值保存在变量中,而不是读取 A[i][j],我可以简单地检查变量,但这根本没有帮助,因为我们仍然从内存中读取值,因此没有单一优势...
【问题讨论】:
-
听起来他们在要求您使用 SIMD,但这并不完整:您需要 4 宽度的算术运算才能充分利用 4 宽度的负载。有没有关于那件事的说法?
-
@harold 我想他不是这个意思,这是实习面试
-
矩阵乘法通常涉及向下一个的行和另一个的列。如果您首先转置其中一个矩阵,则可以通过向下每个矩阵的行(或列)进行乘法运算,以便内存提前获取帮助。虽然转置创建了一个新矩阵,但它是一个 O(1) 操作,并且对于更大的矩阵,增益将抵消它。
-
为什么会提到
What's the use of do while(0) when we define a macro? [duplicate]问题?它们是无关的。 -
我不知道重复项与问题有什么关系......实际的问题是,“当读取任何矩阵的一个值时,CPU 会给你 4 个相邻的右边的”意味着它只得到四个相邻的而不是你要求的那个?或者这是否意味着您获得了 5 个值:您读取的一个值和另外四个值?因为那会改变答案。