当前位置: 首页 > 知识库问答 >
问题:

为什么转置一个512x512的矩阵比转置一个513x513的矩阵慢得多?

张姚石
2023-03-14

在不同大小的方阵上进行了一些实验后,一个模式出现了。对大小为2^n的矩阵进行转置总是比对大小为2^n+1的矩阵进行转置慢。对于n的小值,差异不大。

但是,如果值为512,则会出现很大的差异。(至少对我来说)

免责声明:我知道函数实际上并没有转置矩阵,因为元素的双重交换,但这没有区别。

#define SAMPLES 1000
#define MATSIZE 512

#include <time.h>
#include <iostream>
int mat[MATSIZE][MATSIZE];

void transpose()
{
   for ( int i = 0 ; i < MATSIZE ; i++ )
   for ( int j = 0 ; j < MATSIZE ; j++ )
   {
       int aux = mat[i][j];
       mat[i][j] = mat[j][i];
       mat[j][i] = aux;
   }
}

int main()
{
   //initialize matrix
   for ( int i = 0 ; i < MATSIZE ; i++ )
   for ( int j = 0 ; j < MATSIZE ; j++ )
       mat[i][j] = i+j;

   int t = clock();
   for ( int i = 0 ; i < SAMPLES ; i++ )
       transpose();
   int elapsed = clock() - t;

   std::cout << "Average for a matrix of " << MATSIZE << ": " << elapsed / SAMPLES;
}
    null
    null

共有1个答案

拓拔富
2023-03-14

这一解释来源于Agner Fog在C++中优化软件的过程,并归结为数据是如何被访问和存储在缓存中的。

有关术语和详细信息,请参阅wiki中关于缓存的条目,我将在这里对其进行缩小。

缓存是按集合和行组织的。每次只使用一个集合,其中包含的任何行都可以使用。一行可以镜像的内存乘以行数给出了高速缓存的大小。

set = ( address / lineSize ) % numberOfsets
criticalStride = numberOfSets * lineSize

这是理论部分。接下来的解释(也是Agner,我在紧跟它以免出错):

假设一个64x64的矩阵(记住,效果根据缓存的不同而不同),缓存为8KB,每组4行*行大小为64字节。每行可以容纳矩阵中的8个元素(64位int)。

临界步幅为2048字节,对应于矩阵的4行(在内存中是连续的)。

 类似资料:
  • C++:15秒(源) Python:6分13秒(来源) C++:45分钟(源) 蟒蛇:10小时后被杀死(来源) 为什么Strassen矩阵乘法比标准矩阵乘法慢得多? null null null

  • 问题内容: 我正在自学一些Java,并且坚持创建2D数组,该数组使用随机值对其进行初始化,然后创建该数组的转置。 示例输出为: 原始矩阵 转置矩阵 ^应该是最终输出。代码的一些帮助将不胜感激! 如果行或列的数量超出指定范围,我想编写代码以生成错误消息。以及是否从命令行读取矩阵元素而不是随机生成它们。 问题答案: 这是返回转置矩阵的int [] []的简单方法… 比起打印二维矩阵,您可以使用如下方法

  • 问题内容: 我正在尝试为python创建矩阵转置函数,但似乎无法使其工作。说我有 我想提出我的职能 因此,换句话说,如果我要将此2D数组打印为列和行,我希望将行变成列,将列变成行。 我到目前为止已经做到了,但是没有用 问题答案: Python 2: Python 3:

  • 矩阵(包括稀疏矩阵)的转置,即互换矩阵中所有元素的行标和列标,如图 1 所示: 图 1 矩阵转置示意图 但如果想通过程序实现矩阵的转置,互换行标和列标只是第一步。因为实现矩阵转置的前提是将矩阵存储起来, 数据结构中提供了 3 种存储矩阵的结构,分别是三元组 顺序表、行逻辑链接的顺序表和十字 链表。如果采用前两种结构,矩阵的转置过程会涉及三元组表也跟着改变的问题,如图 2 所示: 图 2 三元组表的

  • 问题内容: 如何获得此矩阵的转置。任何更简单的算法都可以执行此操作… 第一个问题: 第二个问题: Zip给我下面的输出如下,当我不知道数组中有多少个元素时,我如何压缩,在这种情况下,我知道3个元素a [0],a [1],a [2],但是如何我压缩一个[n]个元素 问题答案: 问题答案: 感谢AFG的帮助

  • 我正在看一看大型矩阵乘法,并运行以下实验以形成一个基线测试: null 以下是Octave/MATLAB实现: 运行: hood下的Octave正在使用BLAS(我假设函数) 有人能解释这种差别吗?BLAS实现的体系结构到底是什么?我看到它在使用Fortran,但是在CPU级别上发生了什么呢?它用的是什么算法?它是如何使用CPU缓存的?它调用什么x86-64机器指令?(是使用AVX这样的高级CPU