当前,我正在优化一个MIPS汇编程序,该程序采用 n x n 矩阵并将其与转置相乘。我正在尝试优化矩阵计算算法,以使其在尽可能少的时钟周期内完成。我得到了一个A矩阵,其值存储在RAM中。然后,我必须计算B = A * transpose(A)。
有一些警告:
这是我得到的伪代码示例:
// 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;
}
}
如您所见,为了避免不必要的计算,我已进行了一些交换。
但是,我想知道是否有人可以看到其他加快速度的方式?即巧妙地交换循环顺序等。
任何帮助将不胜感激!