【问题标题】:Row-major multiplication multithreading in CC中的行主乘法多线程
【发布时间】:2017-10-01 17:38:42
【问题描述】:

我已经通过谷歌找到了行优先和列优先背后的逻辑,但似乎没有找到我问题的答案。
我的问题是:
例如,我有三种类型的矩阵维度; 5x50000500x50050000x5。这三个都将具有相同的 250000 乘法。但是,当这些乘法以行为主时,为什么 5x50000 矩阵的执行时间最长?我知道这与缓存有关。我的机器有 L1 32K、L2 256k、L3 8192k。

在谷歌搜索和阅读一些答案后,我了解到 C 程序中的数组是连续存储的,因此行主要是最快的,但我的问题是它与 5x50000 矩阵有什么关系,使其成为最糟糕的?是因为它有很大的列吗? 500x500 做得最好?

任何解释都会很有帮助。 谢谢。

【问题讨论】:

  • 据我记忆,将两个矩阵 M1 和 M2 相乘,M1 中的列数应该等于 M1 中的行数。
  • 是的,当然!我已经在问题中指定了矩阵的维度(rowxcol)。在我的代码中,逻辑是 A[i][j] = A[i*n + j] 其中 i 和 j 是矩阵 A 的行索引和 col 索引,n 是列数。这是行优先乘法。
  • 三个矩阵相乘的顺序是什么?

标签: c multithreading matrix


【解决方案1】:

据我所知,数组存储在内存中的块中。如果您请求一个大阵列,PC 将立即查找所有空间。同时它会尽量使数组在内存中连续。

由于内存分配,需要 50000 个插槽的数组是其超级时间浪费的 5 倍。对于计算机来说,500次在内存中找到500个连续槽更容易。

【讨论】:

  • 好的,所以在这种情况下,我认为即使是 50000x5 也会产生最坏的情况,但事实并非如此。为什么会这样?
  • 不!最坏的情况是 5x50000,因为 PC 将尝试找到 5 个 50000 个插槽的空间。在 50000x5 时,计算机正在寻找 5 个插槽的 50000 个空间。在大量其他内容的内存中很容易找到很多小空间......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多