在MIPS汇编中优化矩阵乘法算法

时间:2019-05-31 02:33:37

标签: performance assembly optimization mips matrix-multiplication

当前,我正在优化一个MIPS汇编程序,该程序采用 n x n 矩阵并将其与转置相乘。我正在尝试优化矩阵计算算法,以使其在尽可能少的时钟周期内完成。我得到了一个A矩阵,其值存储在RAM中。然后,我必须计算B = A * transpose(A)。

有一些警告:

  1. 矩阵乘法必须是A的第i行和B的第j列的点积。这并不意味着是元素方式的乘法。请参阅Wikipedia文章。
  2. 我不会使我的算法在数学上比下面将显示的未修改示例更有效。即将矩阵与其转置相乘时,我无法利用对称性。

这是我得到的伪代码示例:

// Given array A which is unsigned int A[n*n] (ie word or 32 bit form)
// Reset array B which is unsigned int B[n*n] (ie word or 32 bit form)
for(int i = 0; i < (n * n); i++)
{
    B[i] = 0;
}

// Matrix Multiplicaiton B = A*A'
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        for (int k = 0; k < n; k++)
        {
            B[i + n * j] = B[i + n * j] + A[i + n * k] * A[j + n * k];
        }
    }
}

这是我尝试优化上面的示例:

// Given array A which is unsigned int A[n*n] (ie word or 32-bit form)

// Matrix Multiplicaiton B = A*A'
for(int i = 0; i < n; i++)
{   
    for (int j = 0; j < n; j++)
    {
        temp = 0;
        n_times_i = n * i;

        for (int k = 0; k < (n*n); k+=n)
        {
            temp += A[j + k] * A[i + k];
        }

        B[j + n_times_i] = temp;
    }
}

如您所见,为了避免不必要的计算,我已进行了一些交换。

但是,我想知道是否有人可以看到其他加快速度的方式?即巧妙地交换循环顺序等。

任何帮助将不胜感激!

0 个答案:

没有答案