【发布时间】:2016-03-03 06:34:33
【问题描述】:
我需要时间来优化一大段 C 代码以提高速度,我正在寻找一种算法——最好是一个 C“sn-p”——转置一个矩形 源 矩阵 u[r][c] 任意大小(r 行数,c 列数)转换为目标矩阵 v[s][d] (s = c “缓存友好” i. 中的行数,d = r 列数)。 e.尊重数据局部性的方式。 u 的典型大小约为 5000 ... 15000 行 x 50 到 500 列,显然逐行访问元素的缓存效率非常低。
网上有很多关于这个话题的讨论(在这个thread附近),但据我所知,他们都在讨论空间情况,比如方阵、u[r][r],或者定义一个维数组, 即G。 u[r * c],而不是上面提到的“数组数组”(长度相等)在我的数字食谱上下文中使用(背景参见here)。
我非常感谢任何帮助我避免“重新发明轮子”的提示。
马丁
【问题讨论】:
-
如果两个源元素彼此靠近,则对应的目标元素会远离,反之亦然。人们怎么可能希望缓存友好的转置呢?我真的很好奇。
-
找到this。我不太明白它是如何工作的......
-
这个问题是对资源或信息的需求。所以不是那个地方。尝试学术问答:例如计算机科学等。
-
我实际上尝试了一个简单的缓存无意识转置实现,与朴素的方法相比,速度提高了 10 倍。
-
@Ike 是的,现在明白了,事后看来很明显。
标签: c performance matrix transpose cache-oblivious